JavaZone2011惊悚大片-Java阴魂不散
JavaZone2011惊悚大片-Java阴魂不散
一个程序员的喃喃自语
JavaZone2011惊悚大片-Java阴魂不散
URL静态化-UrlRewriteFilter-urlrewrite.xml
UrlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite,最典型应用就把动态URL静态化,便于搜索引擎爬虫抓取你的动态网页,并且适用于任何Web应用服务器(如 Resin,Orion,Tomcat等)。
URL静态化的好处很多:
1、对搜索的友好,因为有些搜索不能抓取动态页面或者对动态抓取的页面没有静态页面效率高。
2、屏蔽内部的url或文件路径结构。
3、美化url,看起来更像html页面。
UrlRewriteFilter使用:
1、下载http://tuckey.org/urlrewrite/#download。解压后将文件放到相应的web-inf/lib和web-inf下。
2、配置web.xml
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
根据自己的需要,将相应目录下的url转给UrlRewriteFilter来处理。
3、配置urlwrite规则文件WEB-INF/urlrewrite.xml
<rule> <from>/vr_show/showid_z([^.]*).*</from> <to type="forward">ProAction!vrShow.action?showId=$1</to> </rule>
注意:
1、urlrewrite.xml是utf-8,所以如果你要在rule上加note标签为中文的话,也一定是要utf-8
2、UrlRewriteFilter最好是配置在web.xml的前面filter上,不然有可能对有些url转换失去作用。
3、在写rule的时,如果有多个参数时,中间的连接符号&应该是&。
urlrewrite.xml标签的一些说明:
urlrewrite属性:有仅只有一个。
rule属性:至少一个。
name属性:可选。
note属性:可选。
condition属性:可选。
type属性:最主要就是 forward (default):在客户端URL是不转向的 redirect 在客户端URL是转向的,所以一般采用 forward。
《我的程序里》!没有一点点防备/也没有一丝顾虑/突然错误出现/在我的日志里/带给我惊奇/身不由己/可是你偏又这样/在我不知不觉中悄悄地消失/从我的堆栈里没有音讯/剩下了报警短信
百度作为全球最大的中文搜索引擎公司,提供基于搜索引擎的各种产品,几乎覆盖了中文网络世界中所有的搜索需求,因此,百度对海量数据处理的要求是比较高的,要在线下对数据进行分析,还要在规定的时间内处理完并反馈到平台上。百度在互联网领域的平台需求要通过性能较好的云平台进行处理了,Hadoop就是很好的选择。在百度,Hadoop主要应用于以下几个方面:
日志的存储和统计;
网页数据的分析和挖掘;
商业分析,如用户的行为和广告关注度等;
在线数据的反馈,及时得到在线广告的点击情况;
用户网页的聚类,分析用户的推荐度及用户之间的关联度。
MapReduce主要是一种思想,不能解决所有领域内与计算有关的问题,百度的研究人员认为比较好的模型应该如图3-4所示,HDFS实现共享存储,一些计算使用MapReduce解决,一些计算使用MPI解决,而还有一些计算需要通过两者来共同处理。因为MapReduce适合处理数据很大且适合划分的数据,所以在处理这类数据时就可以用MapReduce做一些过滤,得到基本的向量矩阵,然后通过MPI进一步处理后返回结果,只有整合技术才能更好地解决问题。
百度现在拥有3个Hadoop集群,总规模在700台机器左右,其中有100多台新机器和600多台要淘汰的机器(它们的计算能力相当于200多台新机器),不过其规模还在不断的增加中。现在每天运行的MapReduce任务在3000个左右,处理数据约120TB/天。
百度为了更好地用Hadoop进行数据处理,在以下几个方面做了改进和调整:
(1)调整MapReduce策略
限制作业处于运行状态的任务数;
调整预测执行策略,控制预测执行量,一些任务不需要预测执行;
根据节点内存状况进行调度;
平衡中间结果输出,通过压缩处理减少I/O负担。
(2)改进HDFS的效率和功能
权限控制,在PB级数据量的集群上数据应该是共享的,这样分析起来比较容易,但是需要对权限进行限制;
让分区与节点独立,这样,一个分区坏掉后节点上的其他分区还可以正常使用;
修改DFSClient选取块副本位置的策略,增加功能使DFSClient选取块时跳过出错的DataNode;
解决VFS(Virtual File System)的POSIX(Portable Operating System Interface of Unix)兼容性问题。
(3)修改Speculative的执行策略
采用速率倒数替代速率,防止数据分布不均时经常不能启动预测执行情况的发生;
增加任务时必须达到某个百分比后才能启动预测执行的限制,解决reduce运行等待map数据的时间问题;
只有一个map或reduce时,可以直接启动预测执行。
(4)对资源使用进行控制
对应用物理内存进行控制。如果内存使用过多会导致操作系统跳过一些任务,百度通过修改Linux内核对进程使用的物理内存进行独立的限制,超过阈值可以终止进程。
分组调度计算资源,实现存储共享、计算独立,在Hadoop中运行的进程是不可抢占的。
在大块文件系统中,X86平台下一个页的大小是4KB。如果页较小,管理的数据就会很多,会增加数据操作的代价并影响计算效率,因此需要增加页的大小。
百度在使用Hadoop时也遇到了一些问题,主要有:
MapReduce的效率问题:比如,如何在shuffle效率方面减少I/O次数以提高并行效率;如何在排序效率方面设置排序为可配置的,因为排序过程会浪费很多的计算资源,而一些情况下是不需要排序的。
HDFS的效率和可靠性问题:如何提高随机访问效率,以及数据写入的实时性问题,如果Hadoop每写一条日志就在HDFS上存储一次,效率会很低。
内存使用的问题:reducer端的shuffle会频繁地使用内存,这里采用类似Linux的buddy system来解决,保证Hadoop用最小的开销达到最高的利用率;当Java 进程内容使用内存较多时,可以调整垃圾回收(GC)策略;有时存在大量的内存复制现象,这会消耗大量CPU资源,同时还会导致内存使用峰值极高,这时需要减少内存的复制。
作业调度的问题:如何限制任务的map和reduce计算单元的数量,以确保重要计算可以有足够的计算单元;如何对TaskTracker进行分组控制,以限制作业执行的机器,同时还可以在用户提交任务时确定执行的分组并对分组进行认证。
性能提升的问题:UserLogs cleanup在每次task结束的时候都要查看一下日志,以决定是否清除,这会占用一定的任务资源,可以通过将清理线程从子Java进程移到TaskTracker来解决;子Java进程会对文本行进行切割而map和reduce进程则会重新切割,这将造成重复处理,这时需要关掉Java进程的切割功能;在排序的时候也可以实现并行排序来提升性能;实现对数据的异步读写也可以提升性能。
健壮性的问题:需要对mapper和reducer程序的内存消耗进行限制,这就要修改Linux内核,增加其限制进程的物理内存的功能;也可以通过多个map程序共享一块内存,以一定的代价减少对物理内存的使用;还可以将DataNode和TaskTracker的UGI配置为普通用户并设置账号密码;或者让DataNode和TaskTracker分账号启动,确保HDFS数据的安全性,防止Tracker操作DataNode中的内容;在不能保证用户的每个程序都很健壮的情况下,有时需要将进程终止掉,但要保证父进程终止后子进程也被终止。
Streaming局限性的问题:比如,只能处理文本数据,mapper和reducer按照文本行的协议通信,无法对二进制的数据进行简单处理。为了解决这个问题,百度人员新写了一个类Bistreaming(Binary Streaming),这里的子Java进程mapper和reducer按照(KeyLen,Key,ValLen,Value)的方式通信,用户可以按照这个协议编写程序。
用户认证的问题:这个问题的解决办法是让用户名、密码、所属组都在NameNode和Job Tracker上集中维护,用户连接时需要提供用户名和密码,从而保证数据的安全性。
百度下一步的工作重点可能主要会涉及以下内容:
内存方面,降低NameNode的内存使用并研究JVM的内存管理;
调度方面,改进任务可以被抢占的情况,同时开发出自己的基于Capacity的作业调度器,让等待作业队列具有优先级且队列中的作业可以设置Capacity,并可以支持TaskTracker分组;
压缩算法,选择较好的方法提高压缩比、减少存储容量,同时选取高效率的算法以进行shuffle数据的压缩和解压;
对mapper程序和reducer程序使用的资源进行控制,防止过度消耗资源导致机器死机。以前是通过修改Linux内核来进行控制的,现在考虑通过在Linux中引入cgroup来对mapper和reducer使用的资源进行控制;
将DataNode的并发数据读写方式由多线程改为select方式,以支持大规模并发读写和Hypertable的应用。
百度同时也在使用Hypertable,它是以Google发布的BigTable为基础的开源分布式数据存储系统,百度将它作为分析用户行为的平台,同时在元数据集中化、内存占用优化、集群安全停机、故障自动恢复等方面做了一些改进。
下面这几篇文章也是介绍百度hadoop应用的情况:
http://blog.csdn.net/zbf8441372/article/details/8169969
http://www.csdn.net/article/2011-04-28/296869
http://www.cnblogs.com/chinacloud/archive/2010/11/08/1871592.html
Lady Java视频
Google的三大核心技术MapReduce、GFS和BigTable论文(中文翻译版)
MapReduce:
http://blog.csdn.net/active1001/archive/2007/07/02/1675920.aspx
GFS:
http://blog.csdn.net/xuleicsu/archive/2005/11/10/526386.aspx
BigTale:
http://blog.csdn.net/accesine960/archive/2006/02/09/595628.aspx
电影《Java风云》预告片
Java打劫搞笑视频
Xen和kvm一样,都是虚拟化开源软件,拥有同样出色的架构设计和性能。Xen和kvm都用于构建IaaS层。
Xen 是一个开放源代码虚拟机监视器,由剑桥大学开发。它打算在单个计算机上运行多达100个满特征的操作系统。操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。
Xen通过一种叫做准虚拟化的技术获得高性能,甚至在某些与传统虚拟技术极度不友好的架构上(x86),Xen也有上佳的表现。与那些传统通过软件模拟实现硬件的虚拟机不同,在Intel VT-X支持下3.0版本之前的Xen需要系统的来宾权限,用来和Xen API进行连接。到目前为止,这种技术已经可以运用在NetBSD, GNU/Linux, FreeBSD和Plan 9系统上。在Brainshare 2005会议上,Novell展示了NetWare与 Xen的连通。与Windows XP连通的技术曾在Xen开发初期进行,但微软的协议未能允许它发布。Sun微系统公司也正在积极地将Solaris移植到Xen平台之上。
Xen虚拟机可以在不停止的情况下在多个物理主机之间实时迁移。在操作过程中,虚拟机在没有停止工作的情况下内存被反复的复制到目标机器。虚拟机在最终目的地开始执行之前,会有一次60-300秒的非常短暂的暂停以执行最终的同步化,给人无缝迁移的感觉。类似的技术被用来暂停一台正在运行的虚拟机到磁盘,并切换到另外一台,第一台虚拟机在以后可以恢复。
Xen目前可以运行在x86系统上,并正在向x86_64、IA64、PPC移植。移植到其他平台从技术上是可行的,未来有可能会实现。
Xen 是一个基于X86架构、发展最快、性能最稳定、占用资源最少的开源虚拟化技术。Xen可以在一套物理硬件上安全的执行多个虚拟机,与 Linux 是一个完美的开源组合,Novell SUSE Linux Enterprise Server 最先采用了XEN虚拟技术。它特别适用于服务器应用整合,可有效节省运营成本,提高设备利用率,最大化利用数据中心的IT基础架构。
Java程序员进化为架构师掌握的知识:
一:Java知识
1、进制转换
2、Java基本数据类型
面向对象相关知识
3、类、接口、抽象类
this关键字、static关键字、final关键字
方法的参数传递机制
Java垃圾回收机制
四种内部类的实现方式
方法重写(override)与重载(overload)的联系与区别通过多态实现程序代码的松耦合
Java 异常体系详解(checked exception 与 unchecked exception)
JDK 5.0 新特性(泛型、枚举、可变参数、增强的 for 循环、静态导入等)
Java Annotation(使用系统内置 Annotation、自定义Annotation、Annotation的继承等)
Java多线程机制详解(锁、synchronized关键字、sleep()方法、wait()方法、notify() 、notifyAll()方法的意义与联系)
Java线程池的内部实现
Java定时任务内部实现
Java I/O编程(装饰模式详解)
Java网络编程基础知识(Socket、URL、URLConnection、ServerSocket等)
TCP与 UDP的联系与区别
Java Collection API(Collection、List、Set、Map、ArrayList、LinkedList、 Vector、 HashSet、 TreeSet、 HashMap与TreeMap等)区别,适用场景
常用设计模式(工厂方法模式、观察者模式、策略模式、装饰模式、模板方法模式、命令模式等的原理与应用)
Java NIO详解
java.util.concurrent 并发包的应用(ConcurrentHashMap核心源代码分析、ThreadPoolExecutor、FutureTask、Semaphore、Condition、ReentrantReadWriteLock等接口与类的深度分析)
基于 JDK 1.4 锁的并发机制与基于 JDK 5.0并发包的同步与并发机制的比较与分析
序列化与反序列化
正则表达式的应用
Java动态代理与反射机制
Java代码的执行机制
源代码编译机制
类加载与执行机制
JVM内存管理(内存空间、内存分配、内存回收)
使用 JConsole、JVisualVM及 JMap等查看内存的使用状况
分析程序执行的过程
JVM线程资源同步及交互机制
线程交互机制与状态分析
Java文件操作相关,递归删除,递归读取
JDBC相关知识,步骤,连接操作,数据库连接池(详解 Apache DBCP数据库连接池)
移位操作 (左移n位==乘以2的n次幂) (右移n位==除以2的n次幂)
二、算法
各种排序算法:快速排序、归并排序、插入排序等等
斐波切纳函数
二分查找
全排列
二叉树的遍历
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)
字符串反转
前缀树
最大堆,最小堆
Hash算法及HashMap算法
ConcurrentLinkedHashMap(LRU)
BloomFilter
LIRS算法 LIRS的基本思想是对访问的数据块进行分类,一部分为hot数据块,一部分为cold数据块。对于hot数据块我们可以分配90%以上的cache给它们。而对于cold数据块给它们分配10%。
从LIRS算法的描述来看,可以理解为两个LRU队列的组合,利用cold缓冲区来保护Hot缓冲区,提高了进入hot缓冲区的门槛,阻止hot缓冲区频繁地变化。
三、数据库
mysql存储引擎
mysql优化
mysql HA解决方案
sql语句优化
NoSQL相关
四、文件系统
Linux主流文件系统
EXT3与EXT4文件系统
主流分布式文件系统分析与对比
分布式文件系统
五、系统相关
共享内存实现机制
mmap的实现原理与机制
copy on write技术
zero copy技术
六、网络相关
OSI七层网络模型
TCP/IP交互流程
HTTP访问流程
七、大型网站架构
负载均衡技术及其原理
智能DNS解析,原理,实现方案
squid web加速及缓存技术
网页静态化