Linux

Linux

shell 脚本中的复制粘贴(如何向word 里那样操作?)

ycf92 回复了问题 3 人关注 3 个回复 4835 次浏览 2019-08-24 13:56 来自相关话题

删除空白行: sed '/^$/d' file shell脚本 基础入门怎么搞?

回复

左左c90 发起了问题 1 人关注 0 个回复 1113 次浏览 2018-04-10 15:35 来自相关话题

linux课时11,用root权限增加,删除,修改用户内容,小象实验室没有root权限,应该怎么练习。

贾方 回复了问题 4 人关注 3 个回复 1692 次浏览 2018-03-16 09:41 来自相关话题

shell脚本依赖关系

史晓江 回复了问题 2 人关注 3 个回复 1808 次浏览 2018-02-22 20:45 来自相关话题

为什么执行不了which mvn,已经加过. /etc /profile

回复

张晓慧 发起了问题 1 人关注 0 个回复 1083 次浏览 2018-02-21 22:20 来自相关话题

linux清缓存

回复

贾婷婷 发起了问题 1 人关注 0 个回复 1104 次浏览 2018-02-21 22:14 来自相关话题

xrdp登录上去,用firefox打开全是方块字,乱码,咋破?

张晓慧 回复了问题 2 人关注 1 个回复 1504 次浏览 2018-02-21 22:09 来自相关话题

远程桌面就有问题

贾婷婷 回复了问题 2 人关注 1 个回复 996 次浏览 2018-02-21 22:06 来自相关话题

怎么把mapred加入到hdfs这个group中

张晓慧 回复了问题 2 人关注 1 个回复 896 次浏览 2018-02-21 21:30 来自相关话题

shell命令

兔撕鸡大爷 回复了问题 2 人关注 1 个回复 978 次浏览 2018-02-21 20:47 来自相关话题

浏览器需要 自己安装吗?

贾婷婷 回复了问题 2 人关注 1 个回复 1042 次浏览 2018-02-21 20:13 来自相关话题

远程桌面怎么打不开了

贾婷婷 回复了问题 2 人关注 1 个回复 1560 次浏览 2018-02-21 20:10 来自相关话题

怎么看是不是被攻击了啊?

史晓江 回复了问题 4 人关注 3 个回复 1177 次浏览 2018-02-21 20:04 来自相关话题

bash: parted: command not found

兔撕鸡大爷 回复了问题 2 人关注 1 个回复 2867 次浏览 2018-02-21 19:56 来自相关话题

免密码是什么的密码?

伤心太平洋 回复了问题 2 人关注 1 个回复 979 次浏览 2018-02-21 19:55 来自相关话题

mac vnc连不上linux机器

周小泉 回复了问题 2 人关注 1 个回复 1542 次浏览 2018-02-21 19:47 来自相关话题

history

周小泉 回复了问题 3 人关注 2 个回复 942 次浏览 2018-02-21 19:41 来自相关话题

大数据ssh

陌然浅笑 回复了问题 2 人关注 2 个回复 1354 次浏览 2018-01-29 16:06 来自相关话题

如何将当前linux系统打成live iso镜像

回复

ycyzlp 发起了问题 1 人关注 0 个回复 1604 次浏览 2017-10-26 17:34 来自相关话题

条新动态, 点击查看
ping不通云主机的公网IP 该问题已经解决,下载了个Proxifier,代理服务器设置如下,代理地址填公司上外网的代理地址,协议选择HTTPS
ping不通云主机的公网IP 该问题已经解决,下载了个Proxifier,代理服务器设置如下,代理地址填公司上外网的代理地址,协议选择HTTPS
wangxiaolei

wangxiaolei 回答了问题 • 2015-11-18 17:10 • 2 个回复 不感兴趣

shell脚本

== 两边要用空格分开
== 两边要用空格分开

shell 脚本中的复制粘贴(如何向word 里那样操作?)

回复

ycf92 回复了问题 3 人关注 3 个回复 4835 次浏览 2019-08-24 13:56 来自相关话题

删除空白行: sed '/^$/d' file shell脚本 基础入门怎么搞?

回复

左左c90 发起了问题 1 人关注 0 个回复 1113 次浏览 2018-04-10 15:35 来自相关话题

linux课时11,用root权限增加,删除,修改用户内容,小象实验室没有root权限,应该怎么练习。

回复

贾方 回复了问题 4 人关注 3 个回复 1692 次浏览 2018-03-16 09:41 来自相关话题

shell脚本依赖关系

回复

史晓江 回复了问题 2 人关注 3 个回复 1808 次浏览 2018-02-22 20:45 来自相关话题

为什么执行不了which mvn,已经加过. /etc /profile

回复

张晓慧 发起了问题 1 人关注 0 个回复 1083 次浏览 2018-02-21 22:20 来自相关话题

linux清缓存

回复

贾婷婷 发起了问题 1 人关注 0 个回复 1104 次浏览 2018-02-21 22:14 来自相关话题

xrdp登录上去,用firefox打开全是方块字,乱码,咋破?

回复

张晓慧 回复了问题 2 人关注 1 个回复 1504 次浏览 2018-02-21 22:09 来自相关话题

远程桌面就有问题

回复

贾婷婷 回复了问题 2 人关注 1 个回复 996 次浏览 2018-02-21 22:06 来自相关话题

怎么把mapred加入到hdfs这个group中

回复

张晓慧 回复了问题 2 人关注 1 个回复 896 次浏览 2018-02-21 21:30 来自相关话题

shell命令

回复

兔撕鸡大爷 回复了问题 2 人关注 1 个回复 978 次浏览 2018-02-21 20:47 来自相关话题

浏览器需要 自己安装吗?

回复

贾婷婷 回复了问题 2 人关注 1 个回复 1042 次浏览 2018-02-21 20:13 来自相关话题

远程桌面怎么打不开了

回复

贾婷婷 回复了问题 2 人关注 1 个回复 1560 次浏览 2018-02-21 20:10 来自相关话题

怎么看是不是被攻击了啊?

回复

史晓江 回复了问题 4 人关注 3 个回复 1177 次浏览 2018-02-21 20:04 来自相关话题

bash: parted: command not found

回复

兔撕鸡大爷 回复了问题 2 人关注 1 个回复 2867 次浏览 2018-02-21 19:56 来自相关话题

免密码是什么的密码?

回复

伤心太平洋 回复了问题 2 人关注 1 个回复 979 次浏览 2018-02-21 19:55 来自相关话题

mac vnc连不上linux机器

回复

周小泉 回复了问题 2 人关注 1 个回复 1542 次浏览 2018-02-21 19:47 来自相关话题

history

回复

周小泉 回复了问题 3 人关注 2 个回复 942 次浏览 2018-02-21 19:41 来自相关话题

大数据ssh

回复

陌然浅笑 回复了问题 2 人关注 2 个回复 1354 次浏览 2018-01-29 16:06 来自相关话题

如何将当前linux系统打成live iso镜像

回复

ycyzlp 发起了问题 1 人关注 0 个回复 1604 次浏览 2017-10-26 17:34 来自相关话题

操作系统学习笔记

编程小梦 发表了文章 2 个评论 1575 次浏览 2015-11-30 21:50 来自相关话题

计算机系统概述基本构成 CPU 内存 I/O 系统总线 PC 程序计数器 IR 指令寄存器 MAR 存储器地址寄存器 MBR 存储器缓冲寄存器 I/O AR I/O地址寄存器 ...查看全部
计算机系统概述基本构成
CPU 内存 I/O 系统总线
PC 程序计数器
IR 指令寄存器
MAR 存储器地址寄存器
MBR 存储器缓冲寄存器
I/O AR I/O地址寄存器
I/O BR I/O缓冲寄存器中断
中断:其他模块(I/O,存储器)中断处理器正常处理过程的机制。
  • 程序中断
  • 时钟中断
  • 硬件失效中断
  • I/O中断
多中断的处理方式第一种方法是当正在处理一个中断时,禁止再发生中断。第二种方法是定义中断优先级,允许高优先级的中断打断低优先级的中断处理器的运行。高速缓冲存储器高速缓冲存储器是比主存小而快的存储器,用以协调主存跟处理器,作为最近储存地址的缓冲区。存储器的层次结构价格, 容量, 访问时间速度: 寄存器 > 高速缓存 > 内存 > 磁盘高速缓存的设计
  • 高速缓存大小
  • 置换算法
  • 块大小
  • 写策略
  • 映射函数
  • 高速缓存的级数
I/O操作的三种技术
  • 可编程I/O
  • 中断驱动I/O
  • 直接存储访问
操作系统概述
  • 作为 用户/计算机 接口
  • 作为资源管理器
批处理 多道程序设计目标 : 充分使用处理器分时 目标: 减少相应时间操作系统的内核内核是操作系统最常使用的部分,它存在于主存中并在特权模式下运行,响应进程调度和设备中断。多道程序设计多道程序设计是一种处理操作,它在两个或多个程序间交错处理每个进程。实地址和虚地址虚地址指的是存在于虚拟内存中的地址,它有时候在磁盘中有时候在主存中。 实地址指的是主存中的地址。内存管理的任务
  • 进程隔离
  • 自动分配和管理
  • 支持模块化程序设计
  • 保护和访问控制
  • 长期存储
操作系统的控制结构操作系统维持着四种不同类型的表:内存,I/O,文件,进程内存,I/O和文件是代表进程而被管理的,因此进程表必须有对这些资源的直接或者间接引用。进程进程是操作系统对正在运行的程序的一种抽象吧进程状态
  • 运行态:该进程正在执行
  • 就绪态:进程做好了准备,只要有机会就开始执行
  • 阻塞态:进程在某些事件发生前不能执行,如I/O操作完成
  • 新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中
  • 退出态:操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消
进程阻塞和挂起阻塞:进程是否等待一个事件挂起:进程是否已经被换出内存进程抢占处理器为了执行另外的进程而终止当前正在执行的进程,这就叫进程抢占进程映像
  • 用户数据
  • 用户程序
  • 系统栈
  • 进程控制块
交换交换是指把主存中某个进程的一部分或者全部内容转移到磁盘。当主存中没有处于就绪态的进程时,操作系统就把一个阻塞的进程换出到磁盘中的挂起队列,从而使另一个进程可以进入主存执行进程间通信1、管道:管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。无名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(通常是指父子进程关系)的进程间使用。命名管道:命名管道也是半双工的通信方式,在文件系统中作为一个特殊的设备文件而存在,但是它允许无亲缘关系进程间的通信。当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。2、信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。3、消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。4、信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。5、共享内存:共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。6、套接字:套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。进程控制块进程标识,处理器状态信息,进程控制信息用户模式和内核模式用户模式下可以执行的指令和访问的内存区域都受到限制。这是为了防止操作系统受到破坏或者修改。而在内核模式下则没有这些限制,从而使它能够完成其功能创建新进程的步骤[list=1]
  • 给新进程分配一个唯一的进程标识号。
  • 给进程分配空间。
  • 初始化进程控制块。
  • 设置正确的连接。
  • 创建或扩充其他的数据结构。
  • 模式切换和进程切换的区别发生模式切换可以不改变当前正处于运行态的进程的状态。发生进程切换时,一个正在执行的进程被中断,操作系统指定另一个进程为运行态。进程切换需要保存更多的状态信息线程线程和进程的区别①从概念上:进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。线程:一个进程内的基本调度单位。线程的划分尺度小于进程,一个进程包含一个或者更多的线程。②从执行过程中来看:进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。③从逻辑角度来看(重要区别):多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。互斥和同步临界区临界资源就是一次只允许一个进程访问的资源所谓临界区就是进程中访问临界资源的那段程序代码同步机制应遵循的准则空闲让进,忙则等待,有限等待,让权等待PVP,V操作是因为Dijkstra是荷兰人,P指的是荷兰语中的“proberen”,意为“测试”,而V指的是荷兰语中的“verhogen”,意为“增加”。  123456=inherit !importantP=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantwhile=inherit !important =inherit !important(=inherit !importantS≤=inherit !important0=inherit !important)=inherit !important  =inherit !important{=inherit !importantdo=inherit !important =inherit !importantnothing=inherit !important}=inherit !important; =inherit !important        =inherit !importantS=inherit !important==inherit !importantS=inherit !important-=inherit !important1=inherit !important; =inherit !importantV=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantS=inherit !important==inherit !importantS=inherit !important+=inherit !important1=inherit !important;  但是这样明显违反了“让权等待的原则”记录型信号量  12345678=inherit !importantP=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important==inherit !important =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important-=inherit !important1=inherit !important;=inherit !important    =inherit !importantif=inherit !important(=inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important&=inherit !importantlt=inherit !important;=inherit !important =inherit !important0=inherit !important)=inherit !important       =inherit !importantblock=inherit !important(=inherit !importantS=inherit !important,=inherit !importantQ=inherit !important)=inherit !important; =inherit !importantV=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important==inherit !important =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important+=inherit !important =inherit !important1=inherit !important;=inherit !important    =inherit !importantif=inherit !important(=inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important&=inherit !importantlt=inherit !important;=inherit !important==inherit !important =inherit !important0=inherit !important)=inherit !important        =inherit !importantwakeup=inherit !important(=inherit !importantS=inherit !important,=inherit !importantQ=inherit !important)=inherit !important;  P操作相当于“等待一个信号”,而V操作相当于“发送一个信号”,在实现同步过程中,V操作相当于发送一个信号说合作者已经完成了某项任务,在实现互斥过程中,V操作相当于发送一个信号说临界资源可用了。实际上,在实现互斥时,P,V操作相当于申请资源和释放资源。同步与互斥实现的P,V操作虽然都是成对出现,但是互斥的P,V操作出现在同一个进程的程序里,而同步的P,V操作出现在不同进程的程序中死锁和饥饿
    • 死锁预防
    • 死锁避免
    • 死锁检测
    死锁的条件
    • 互斥
    • 占有且等待
    • 非抢占
    • 循环等待
    内存管理内部碎片和外部碎片内部碎片是指由于被装入的数据块小于分区大小而导致的分区内部所浪费的空间。外部碎片是与动态分区相关的一种现象,它是指在所有分区外的存储空间会变成越来越多的碎片的逻辑地址、相对地址和物理地址逻辑地址是指与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须把它转化成物理地址。相对地址是逻辑地址的一个特例,是相对于某些已知点(通常是程序的开始处)的存储单元。物理地址或绝对地址是数据在主存中的实际位置。页和帧在分页系统中,进程和磁盘上存储的数据被分成大小固定相等的小块,叫做页。而主存被分成了同样大小的小块,叫做帧。一页恰好可以被装入一帧中。页和段分段是细分用户程序的另一种可选方案。采用分段技术,程序和相关的数据被划分成一组段。尽管有一个最大段长度,但并不需要所有的程序的所有段的长度都相等虚拟内存简单分页与虚拟分页简单分页:一个程序中的所有的页都必须在主存储器中程序才能正常运行,除非使用覆盖技术。虚拟内存分页:不是程序的每一页都必须在主存储器的帧中来使程序运行,页在需要的时候进行读取。页表项
    • 帧号:用来表示主存中的页来按顺序排列的号码。
    • 存在位(P):表示这一页是否当前在主存中。
    • 修改位(M):表示这一页在放进主存后是否被修改过
    驻留集和工作集一个进程的驻留集是指当前在主存中的这个进程的页的个数。一个进程的工作集是指这个进程最近被使用过的页的个数。单处理器调度
    • 短程调度
    • 中程调度
    • 长程调度
    多处理器和实时调度I/O管理和磁盘调度文件管理文件组织
    • 顺序文件
    • 索引顺序文件
    • 索引文件
    • 直接或者散列文件
    文件分配方法
    • 连续文件
    • 链接文件
    • 索引文件

    链接库动态链接库与静态链接库的区别
    静态链接库是.lib格式的文件,一般在工程的设置界面加入工程中,程序编译时会把lib文件的代码加入你的程序中因此会增加代码大小,你的程序一运行lib代码强制被装入你程序的运行空间,不能手动移除lib代码。
    动态链接库是程序运行时动态装入内存的模块,格式*.dll,在程序运行时可以随意加载和移除,节省内存空间。
    在大型的软件项目中一般要实现很多功能,如果把所有单独的功能写成一个个lib文件的话,程序运行的时候要占用很大的内存空间,导致运行缓慢;但是如果将功能写成dll文件,就可以在用到该功能的时候调用功能对应的dll文件,不用这个功能时将dll文件移除内存,这样可以节省内存空间

    Hadoop 2.0 部署单机HDFS+YARN——示例

    wangxiaolei 发表了文章 0 个评论 3402 次浏览 2015-11-25 14:36 来自相关话题

    准备Linux 虚拟机环境 1、用Oracle VM VirtualBox 虚拟Linux 系统 虚拟好的Linux 操作系统:ubuntu-14.04-desktop-i386 准备好:hadoop-2.2.0.tar.g ...查看全部
    准备Linux 虚拟机环境
    1、用Oracle VM VirtualBox 虚拟Linux 系统
    虚拟好的Linux 操作系统:ubuntu-14.04-desktop-i386
    准备好:hadoop-2.2.0.tar.gz jdk-6u45-linux-i586.bin

    图片1.jpg


    2、设置hosts 文件
    对linux 虚机的hosts 进行设置sudo vi /etc/hosts
    加入127.0.0.1 YARN001

    图片2.jpg


    3、安装jdk 和hadoop
    拥有执行权限: chmod +x jdk-6u45-linux-i586.bin
    解压JDK:./jdk-6u45-linux-i586.bin
    解压成功后,ls 查看下

    图片3.jpg


    解压hadoop 的安装包:tar -zxvf hadoop-2.2.0.tar.gz
    解压成功后,ls 查看下

    图片4.jpg


    修改hadoop 的配置文件
    1、配置文件列表图例展示

    图片5.jpg


    2、修改hadoop-env.sh 文件
    进入hadoop 目录下: cd hadoop-2.2.0/ ,输入命令vi etc/hadoop/hadoop-env.sh
    也可以使用ftp 工具传输到本地,用编辑器编辑此文件。
    export JAVA_HOME=/home/wangxiaolei/hadoop/jdk1.6.0_45

    图片6.jpg


    3、修改mapred-site.xml 文件
    重命名mapred-site.xml.template 为mapred-site.xml
    输入命令vi etc/hadoop/mapred-site.xml
    添加下面的配置[code=Xml]

    mapreduce.framework.name
    yarn

    [/code]4、修改core-site.xml 文件
    输入命令vi etc/hadoop/core-site.xml[code=Xml]

    fs.default.name
    hdfs://YARN001:8020

    [/code]5、修改core-site.xml 文件
    输入命令vi etc/hadoop/hdfs-site.xml
    注意:1、单机版副本数dfs.replication 的值默认是3 这里写为1
    2、dfs.namenode.name.dir 和dfs.datanode.data.dir 的默认值,
    在hadoop 安装目录下的tmp 目录下。
    3、这里修改为非tmp 目录,此目录无需存在。
    它是在启动hadoop 时目录是自动创建的。[code=Xml]

    dfs.replication
    1


    dfs.namenode.name.dir
    /home/wangxiaolei/hadoop/dfs/name


    dfs.datanode.data.dir
    /home/wangxiaolei/hadoop/dfs/data

    [/code]6、修改yarn-site.xml 文件
    输入命令vi etc/hadoop/yarn-site.xml[code=Xml]

    yarn.nodemanager.aux-services
    mapreduce_shuffle

    [/code]部署HDFS+YARN
    1、格式化NameNode
    第一次搭建环境,需要格式化
    输入命令bin/hadoop namenode -format
    完成后,查看/home/wangxiaolei/hadoop 发现自动创建的目录文件

    图片7.jpg


    2、启动namenode
    输入命令sbin/hadoop-daemon.sh start namenode

    图片8.jpg


    3、启动datanode
    输入命令sbin/hadoop-daemon.sh start datanode

    图片9.jpg


    4、验证HDFS 是否启动成功
    在本机上配置host
    192.168.1.122 yarn001
    然后在浏览器窗口输入http://yarn001:50070

    图片10.jpg


    bin/hadoop fs -mkdir /home
    bin/hadoop fs -mkdir /home/wangxiaolei

    图片11.jpg


    5、启动yarn
    输入命令sbin/start-yarn.sh

    图片12.jpg


    6、验证yarn 是否启动成功
    6.1 使用jps 查看进程
    这里没有配置jdk 的环境变量,所以要指定jps 的存放目录。

    图片13.jpg


    6.2 在web 界面查看
    在本机浏览器中输入http://yarn001:8088

    图片14.jpg


    6.3 此时就可以跑MapReduce 程序了。
    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar pi 2 100

    7、关闭yarn
    输入命令sbin/stop-yarn.sh

    图片15.jpg


    8、关闭HDFS
    输入命令sbin/stop-dfs.sh

    图片16.jpg


    最后使用jps 查看下进程

    图片17.jpg


    单机版部署HDFS+YARN 顺利完成!

    跟我学系列之趣解NIO和IO的区别

    colincheng 发表了文章 0 个评论 1316 次浏览 2015-11-18 15:03 来自相关话题

    在上一次分享中,咱们谈到了阻塞与非阻塞,同步与异步的区别,http://www.jianshu.com/p/e9c6690c0737 那么在这一次分享中,咱们主要是以讲故事的方式讲述一下NIO和IO的区别。那么在下一次分享中,将进行Java NIO ...查看全部
    在上一次分享中,咱们谈到了阻塞与非阻塞,同步与异步的区别,http://www.jianshu.com/p/e9c6690c0737
    那么在这一次分享中,咱们主要是以讲故事的方式讲述一下NIO和IO的区别。那么在下一次分享中,将进行Java NIO源码的分析。

    故事的背景:
    有一个动物园,动物园里面有狮子,老虎,猴子等动物,他们每天定期来吃不同的水果,而这些水果要由动物园管理员到货场领取分配。

    一、IO
    我们知道,在使用IO的时候往往可以在服务器端使用多线程或者线程池来处理并发请求,这也叫伪异步,那么故事开始了:
    在货场里有五个动物园管理员等待水果货车的到来,他们一直在等待,如果货车不来他们也要死等,直到货车的到来,这时候货车来了,每个管理员都领了一份水果去寻找动物,管理员A来到狮子旁边,给狮子一份苹果,狮子开始吃,中途吃累了,休息了一会儿继续吃,这时候管理员A就一直等着狮子吃完,再回去拿水果去另一个动物那里。五个管理员都是这样做的。

    二、NIO
    Java NIO是在jdk1.4开始使用的,它既可以说成“新IO”,也可以说成非阻塞式I/O。下面是java NIO的工作原理:
    由一个专门的线程来处理所有的IO事件,并负责分发。
    事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
    线程通讯:线程之间通过wait,notify等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。

    那么故事开始了:动物园里,有一个管理员他先去了解动物们都喜欢吃什么样的水果并做了一个登记,然后去货场看一看货车有没有到来,如果没有来他就回去继续干别的事,就这样每隔一段时间就去货场看一下。这时候货车来了,他叫来另外五个管理员并告诉管理员哪些动物喜欢吃哪些水果,管理员们分类取不同的水果,然后各自去找动物们分发水果,还是管理员A,来到狮子旁边把它喜欢吃的苹果给它吃,狮子吃的比较慢,这时候管理员A说,你先吃着,我给其他动物送水果,我一会儿再来取水果盘子,这时候管理员A回去取来香蕉继续猴子送去,在猴子吃香蕉累了休息的时候,管理员A来找狮子拿回水果盘子,再去找猴子拿回水果盘子。
    不知道大家在看完这二个小故事之后有没有理解NIO和IO,那么在下次分享的时候,咱们将正式进入NIO原理及源码的分享,谢谢大家。

    Shell写Wordcount程序

    唐半张 发表了文章 0 个评论 1749 次浏览 2015-09-30 10:02 来自相关话题

    Mapper: #! /bin/sh while read LINE;do    for word in $LINE    do         echo "$word 1"    don ...查看全部
    Mapper:
    #! /bin/sh
    while read LINE;do
       for word in $LINE
       do
            echo "$word 1"
       done
    done


    Reducer:

    #! /bin/sh
    count=0
    started=0
    word="" 
    while read LINE;do
      newword=`echo $LINE | cut -d ' ' -f 1`
      if [ "x" == x"$newword" ];then
            continue
      fi    
      if [ "$word" != "$newword" ];then
            [ $started -ne 0 ] && echo -e "$word\t$count"
            word=$newword 
            count=1
            started=1
      else 
            count=$(( $count + 1 ))
      fi
    done


    测试:cat test | sh mapper.sh | sort | sh reducer.sh

    但是用haoop jar 执行,报一下错误:
    13/12/08 00:24:07 ERROR streaming.StreamJob: Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201312072336_0008_m_000000
    13/12/08 00:24:07 INFO streaming.StreamJob: killJob...
    Streaming Command Failed!

    virtualbox下Ubuntu环境配置

    唐半张 发表了文章 0 个评论 2174 次浏览 2015-09-28 10:41 来自相关话题

    一、SSH安装 sudo apt-get install openssh-server 复制代码 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即 ...查看全部
    一、SSH安装
    1. sudo apt-get install openssh-server

    复制代码
    Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。
    然后确认sshserver是否启动了:
    1. ps -e |grep ssh

    复制代码
    如果只有ssh-agent那ssh-server还没有启动,需要/etc/init.d/ssh start,如果看到sshd那说明ssh-server已经启动了。
    ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务:
    1. sudo /etc/init.d/sshd restart

    复制代码

    二、网络设置
    1、NAT    网络地址转换模式(NAT,Network Address Translation)
        只能单向访问、虚拟机与虚拟机之间也不互通
    2、Bridged Adapter    桥接模式
        虚拟机与主机、虚拟机与虚拟机均可互通
    3、Internal    内部网络模式
        内网模式,就是内部网络模式,虚拟机与外网完全断开;虚拟机与主机不同、虚拟机间互通
    4、Host-only Adapter  主机模式
        相对复杂模式通过配置可以互通


    PS:最好设置成桥接。


    静态IP设置:
    1. vim /etc/network/interfaces

    复制代码
    1. auto eth0
    2. iface eth0 inet static
    3. address 192.168.3.90
    4. gateway 192.168.3.1
    5. netmask 255.255.255.0

    复制代码重启生效:
    1. /etc/init.d/networking restart

    复制代码

    设置DNS:
    1. vim /etc/resol.conf

    复制代码
    1. nameserver 192.168.1.1

    复制代码

    三、JDK安装
    1、到官网下载吧。这期推荐的ubuntu是32位的。所以我下载的是jdk-7u45-linux-i586.gz。
    2、压缩包传到你指定的位置并解压
    1. sudo tar zxvf jdk-7u45-linux-i586.gz

    复制代码3、环境变量设置:
    1. sudo gedit /etc/environment

    复制代码
    1. JAVA_HOME="/usr/local/lib/jdk1.7.0_45"
    2. CLASSPATH=".:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar"

    复制代码在PATH中添加$JAVA_HOME/bin,注意与PATH原有的值之间用英文冒号:分隔,切勿把原来的值删除。
    或者
    1. sudo /etc/profile

    复制代码
    1. export JAVA_HOME=/usr/local/lib/jdk1.7.0_45
    2. export JRE_HOME=/usr/local/lib/jdk1.7.0_45/jre
    3. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    4. export PATH=$JAVA_HOME/bin: $PATH

    复制代码然后保存,并执行source /etc/environment 或者  source /etc/profile 使变量生效
    检验是否设置成功:
    1. java -version

    复制代码四、Ubuntu源
    • 首先备份源列表:
    [list=1]
  • sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
  • 复制代码
    • 而后用gedit或其他编辑器打开:
    [list=1]
  • gksu gedit /etc/apt/sources.list
  • kdesudo kate /etc/apt/sources.list  
  • gksu mousepad /etc/apt/sources.list
  • gksu leafpad /etc/apt/sources.list (12.04版)
  • gksu gedit /etc/apt/sources.list
  • 复制代码从下面列表中选择合适的源,替换掉文件中所有的内容,保存编辑好的文件: 注意:一定要选对版本
    • 然后,刷新列表:
    [list=1]
  • sudo apt-get update

  • 复制代码 注意:一定要执行刷新各种源地址:http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8 
    从网上搜集的资料,整理出来,并按照这个一步一步操作的。主要面向的是像我这样的linux小白。熟悉linux的飘过吧。

    ubuntu配置hadoop

    夕阳丶一抹红颜 发表了文章 0 个评论 1710 次浏览 2015-09-22 09:48 来自相关话题

    在Ubuntu下配置Hadoop步骤 1. 确定安装并打开ssh: 安装: sudo apt-get openssh-server 查看是否运行: ps -e |grep ssh 如果看到 ...查看全部
    Ubuntu配置Hadoop步骤
    1. 确定安装并打开ssh:
    安装:
    sudo apt-get openssh-server
    查看是否运行:
    ps -e |grep ssh
    如果看到sshd那说明ssh-server已经启动了。
    如果没有则可以这样启动:
    sudo /etc/init.d/ssh start
    ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定 义成其他端口号,如222。
    然后重启SSH服务:
    sudo /etc/init.d/ssh stop
    sudo /etc/init.d/ssh start
    2. 修改/etc/hosts:
    若是本机,IP地址设为127.0.0.1即可。IP地址后的名字均为计算机名。(可用hostname命令查看本机的计算机名)
    示例如下:
    192.168.18.62 DC-001
    192.168.18.63 DC-002
    127.0.0.1 czxttkl
    3.设置ssh,在命令行中输入:
    ssh-keygen -t rsa
    会在~/.ssh/ 中生成两个文件:id_ rsa.pub和id_ rsa
    使用命令:
    cat ~/.ssh/id_ rsa.pub >> ~/.ssh/authorized_keys
    然后将authorized_keys复制到所有机器的~/.ssh目录下,主机就可以在所有机器中ssh免密码登陆了。
    示例authorized_keys文件:
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA20Rn8qNN76R5eyeAjC6eRGjzBs095/VkPMYNqW+JqyfNI3hQ97j+ivyapzCG7HnVjGzCBDVJzfAx2twteHjwWfUzysdI38ee0aRrfesEpe/t11HeeyO3GUj7iDJUzKA4j55fIJwrMQOE6mBzxt2e331Zh7awNDXZSE7xGzsk0wWW6yBQUzoW0g2tWyL3Ipp2ZnNawvUU0rNrw7m4cqwuvLXrSEkOZ3IKAGFwXgT+PUZWSRE81YC8IRINDgQFu8ktg6/n5KHl9bVbWNFe7tIedUAErXN0xt5H/yyAyAWBHtxCqRnnsd4G8NM4GmxvPmuQ7nmYvNM3BleO1/2TICez czxttkl@czxttkl
    @前为登录时的用户名,@后为计算机名
    验证ssh设置成功:
    在命令行中输入:ssh czxttkl, 首次登录会出现如下提示,忽略提示,直接yes:
    The authenticity of host 'czxttkl (127.0.0.1)' can't be established.
    ECDSA key fingerprint is dd:55:3f:79:81:0b:39:89:7b:30:c7:60:99:a7:ef:4e.
    Are you sure you want to continue connecting (yes/no)? yes
    登录成功后的提示:
    Welcome to Ubuntu 12.10 (GNU/Linux 3.5.0-17-generic x86_64)
    * Documentation:  https://help.ubuntu.com/
    New release '13.04' available.
    Run 'do-release-upgrade' to upgrade to it.
    Last login: Tue May  7 09:31:58 2013 from ubuntu.ubuntu-domain
    4. 确保防火墙关闭、jdk1.6已经安装
    5. 解压hadoop安装包至某一位置。将命令行定位至HADOOP解压位置/conf文件夹内,进行文件配置
    core-site.xml添加fs.default.name属性:





    fs.default.name
    hdfs://localhost:9000


    hadoop-env.sh添加JAVA_HOME路径:
    # The java implementation to use.  Required.
    export JAVA_HOME=/usr/local/java/jdk1.6.0_38
    hdfs-site.xml添加以下属性:





    dfs.replication
    2


    dfs.datanode.max.xcievers
    2047


    dfs.name.dir
    /home/czxttkl/hadoop/hdfs/name
    true


    dfs.data.dir
    /home/czxttkl/hadoop/hdfs/data
    true


    mapred-site.xml添加mapred.job.tracker属性:





    mapred.job.tracker
    localhost:9001


    6. 添加 HADOOP解压位置/bin 文件夹至PATH路径。
    7.格式化namenode:
    hadoop namenode -format
    8.运行HADOOP解压位置/bin/start-all.sh 开启Hadoop, 更多使用方法:
    * start-all.sh 启动所有的Hadoop守护。包括namenode, datanode, jobtracker, tasktrack
    * stop-all.sh 停止所有的Hadoop。
    * start-mapred.sh 启动Map/Reduce守护。包括Jobtracker和Tasktrack。
    * stop-mapred.sh 停止Map/Reduce守护
    * start-dfs.sh 启动Hadoop DFS守护.Namenode和Datanode
    * stop-dfs.sh 停止DFS守护
    9. 简单测试
    输入命令:jps,查看目前进程,应如下所示
    4350 Jps
    3965 SecondaryNameNode
    4055 JobTracker
    4295 TaskTracker
    3501 NameNode
    在HDFS建立目录:
    hadoop dfs -mkdir testdir
    复制文件到HDFS:
    hadoop dfs -put /SOME/WHERE/large.zip testfile.zip
    查看HDFS的现有文件:
    hadoop dfs –ls /

    批量设置ssh无密码登陆脚本

    cenyuhai 发表了文章 0 个评论 1548 次浏览 2015-09-11 14:31 来自相关话题

    最近要给集群设置ssh无密码登陆,如果需要手动设置这个无密码登陆,所以在网上找了几个脚本,亲测下面这个好使,并且设置比较简单。 需要用root账户执行,我也是要给root账户设置无密码登陆。 首先我们要创建密码,执行下面这句命令: ...查看全部
    最近要给集群设置ssh无密码登陆,如果需要手动设置这个无密码登陆,所以在网上找了几个脚本,亲测下面这个好使,并且设置比较简单。
    需要用root账户执行,我也是要给root账户设置无密码登陆。
    首先我们要创建密码,执行下面这句命令:
    ssh-keygen -t rsa
    脚本如下:我们仅仅需要修改的就是node=()里面的主机名就可以了,当前前提是你必须在/etc/hosts 配置了。
     
    #!/bin/bash
    node=(hadoop.Master hadoop.SlaveT1 hadoop.SlaveT2) # hostname for each node
    username=root # username to be interconnected
    homename=$username # home dir, i.e. home/zhangyang
    if [ "$username" = "root" ];
    then
    homename=root
    else
    homename=home/$username
    fi

    for((i=0; i<${#node[*]}; i++))
    do
    ssh $username@${node[i]} 'ssh-keygen -t rsa; chmod 755 ~/.ssh'
    done
    #cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

    echo "batch authorized_keys created..."
    echo "start scp..."

    #scp node003:/$homename/.ssh/authorized_keys /$homename/.ssh/node003.key
    for((i=0; i<${#node[*]}; i++))
    do
    scp ${node[i]}:/$homename/.ssh/id_rsa.pub /$homename/.ssh/${node[i]}.key
    echo "scp from ${node[i]} finished..."
    done

    echo "append key to authorized_keys..."
    for((i=0; i<${#node[*]}; i++))
    do
    cat /$homename/.ssh/${node[i]}.key >> /$homename/.ssh/authorized_keys
    echo "append ${node[i]}.key finished..."
    done

    echo "append all key finished..."
    loop=${#node[*]}
    let subloop=loop-1
    echo "starting scp complete authorized_keys to ${node[1]}~${node[subloop]}"
    for((i=1; i<${#node[*]}; i++))
    do
    scp /$homename/.ssh/authorized_keys ${node[i]}:/$homename/.ssh/authorized_keys
    echo "scp to ${node[i]} finished..."
    done
    echo "scp all nodes finished..."

    # delete intermediate files
    rm -rf /$homename/.ssh/*.key
    echo "all configuration finished..."


     
    然后给脚本授予执行的权限 chmod +x batchSSH.sh
    然后执行./batchSSh.sh
    当然这个脚本也有缺陷,它需要自己手动输入密码,如果节点多的话,还是很痛苦的,不过还好啦,比起自己手动搞的话,好多了,谁叫我不懂shell呢,哈哈!
     

    MD5鉴定文件是否相同

    cenyuhai 发表了文章 0 个评论 1819 次浏览 2015-09-11 14:11 来自相关话题

    由于诸多安全因素,需要对网上下载的一些文件进行完整性校验。比如,由于工作需要我下载了一个EMOS_1.5_i386.iso镜像文件(extmail邮件系统),需要对其进行MD5校验。为此,用C# 2005写了一个获取文件MD5码的简单程序。 用MD ...查看全部
    由于诸多安全因素,需要对网上下载的一些文件进行完整性校验。比如,由于工作需要我下载了一个EMOS_1.5_i386.iso镜像文件(extmail邮件系统),需要对其进行MD5校验。为此,用C# 2005写了一个获取文件MD5码的简单程序。
    用MD5进行文件校验,步骤如下:
    1) 从文件发布单位那获取原始MD5码;
    2) 用程序获取该文件的MD5码;
    3) 对比1)和2)的MD5码是否一致;
    从上可以看出,根据文件通过程序计算其MD5码是关键,下表所示为C#获取文件MD5码的代码。新建一个windows应用程序,在默认窗体form1中添加:
    一个按钮”btnOpenFile”,click事件代码如下;
    一个文本框”txtMD5”,显示文件的MD5码;
    //选择文件
    private void btnOpenFile_Click(object sender, EventArgs e)
    {
    using (OpenFileDialog dialog = new OpenFileDialog())
    {
    if (dialog.ShowDialog() == DialogResult.OK)
    {
    String fileName = dialog.FileName;
    this.txtMD5.Text = "";
    //this.txtSH1.Text = "";
    //
    this.txtMD5.Text = getMD5Hash(fileName);
    //this.txtSH1.Text = GetMD5Hash(fileName);
    }
    }
    }
    //计算文件的MD5码
    private string getMD5Hash(string pathName)
    {
    string strResult = "";
    string strHashData = "";
     
    byte[] arrbytHashValue;
    System.IO.FileStream oFileStream = null;
     
    System.Security.Cryptography.MD5CryptoServiceProvider oMD5Hasher =
    new System.Security.Cryptography.MD5CryptoServiceProvider();
     
    try
    {
    oFileStream = new System.IO.FileStream(pathName, System.IO.FileMode.Open,
    System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite));
    arrbytHashValue = oMD5Hasher.ComputeHash(oFileStream);//计算指定Stream 对象的哈希值
    oFileStream.Close();
    //由以连字符分隔的十六进制对构成的String,其中每一对表示value 中对应的元素;例如“F-2C-4A”
    strHashData = System.BitConverter.ToString(arrbytHashValue);
    //替换-
    strHashData = strHashData.Replace("-", "");
    strResult = strHashData;
    }
    catch (System.Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
     
    return strResult;
    }
     
    本demo的文件EMOS_1.5_i386.iso,其官方MD5代码为c8b4494715166118bd94dd2a39e640c4,程序得到的md5代码为c8b4494715166118bd94dd2a39e640c4。