Java线程安全

线程安全,那么什么是线程不安全呢?
在单线程运行的情况下,如果 sum = 0,加1后,sum=1一定是对的,但在多线程的情况下,有两个线程同时对sum加1,那么结果可能有两种,一种是sum=1,一种是sum=2;原因就在于sum被定义为全局变量。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
这两篇文章总结的很到位:
http://www.iteye.com/topic/806990
http://www.iteye.com/topic/808550

MapR与Ubuntu携手推免费版Hadoop工具

MapR与Ubuntu Linux开发商Canonical合作,实现Ubuntu与Hadoop大数据平台无缝兼容。
据介绍,Ubuntu/MapR包括MapR M3版本的Hadoop,以支持Ubuntu 12.04 LTS和12.10版本。该软件目前可以通过Canonical的Ubuntu合作伙伴获得,时间从4月25日开始。
Canonical公司副总裁Kyle MacDonald表示,MapR M3是一款易于部署的企业级Hadoop解决方案,“我们为Ubuntu客户提供了高效执行大数据的新途径”。
MapR M3是一款捆绑有HBase数据库、Pig开发分析工具、Hive数据仓库系统、Sqoop数据传输软件和其他Hadoop相关组件的免费版软件。
MapR是什么:
MapR是MapR Technologies, Inc的一个产品,号称下一代Hadoop,使Hadoop变为一个速度更快、可靠性更高、更易于管理、使用更加方便的分布式计算服务和存储平台,同时性能也不断提高。它将极大的扩大了Hadoop的使用范围和方式。它包含了开源社区的许多流行的工具和功能,例如Hbase、Hive。它还100%和Apache Hadoop的API兼容。它能够为客户节约一半的硬件资源消耗,使更多的组织能够利用海量数据分析的力量提高竞争优势。目前有两个版本,M3和M5,其中M3是免费的,M5为收费版,有试用期。
更多资料:
http://www.mapr.com/
http://blog.chinaunix.net/uid-20787846-id-3015631.html

本地模式运行storm的demo

本例实现的是本地模式运行storm的wordcount demo!
开发过程中,可以用本地模式来运行Storm,这样就能在本地开发,在进程中测试Topology。一切就绪后,以远程模式运行 Storm,提交用于在集群中运行的Topology。
创建工程:demo-storm
目录结构如下:
demo-storm
——src/main/java
————com.youku.demo
————————bolts
————————spouts
——src/test/java
——src/main/resource
————words.txt

storm-demo工程目录

storm-demo工程目录


WordCounter.java:

package com.youku.demo.bolts;
import java.util.HashMap;
import java.util.Map;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
public class WordCounter extends BaseBasicBolt {
	Integer id;
	String name;
	Map<String, Integer> counters;
	/**
	 * At the end of the spout (when the cluster is shutdown
	 * We will show the word counters
	 */
	@Override
	public void cleanup() {
		System.out.println("-- Word Counter ["+name+"-"+id+"] --");
		for(Map.Entry<String, Integer> entry : counters.entrySet()){
			System.out.println(entry.getKey()+": "+entry.getValue());
		}
	}
	/**
	 * On create
	 */
	@Override
	public void prepare(Map stormConf, TopologyContext context) {
		this.counters = new HashMap<String, Integer>();
		this.name = context.getThisComponentId();
		this.id = context.getThisTaskId();
	}
	public void declareOutputFields(OutputFieldsDeclarer declarer) {}
	public void execute(Tuple input, BasicOutputCollector collector) {
		String str = input.getString(0);
		/**
		 * If the word dosn't exist in the map we will create
		 * this, if not We will add 1
		 */
		if(!counters.containsKey(str)){
			counters.put(str, 1);
		}else{
			Integer c = counters.get(str) + 1;
			counters.put(str, c);
		}
	}
}

WordNormalizer.java:

package com.youku.demo.bolts;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class WordNormalizer extends BaseBasicBolt {
	public void cleanup() {}
	/**
	 * The bolt will receive the line from the
	 * words file and process it to Normalize this line
	 *
	 * The normalize will be put the words in lower case
	 * and split the line to get all words in this
	 */
	public void execute(Tuple input, BasicOutputCollector collector) {
        String sentence = input.getString(0);
        String[] words = sentence.split(" ");
        for(String word : words){
            word = word.trim();
            if(!word.isEmpty()){
                word = word.toLowerCase();
                collector.emit(new Values(word));
            }
        }
	}
	/**
	 * The bolt will only emit the field "word"
	 */
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields("word"));
	}
}

WordReader.java:

package com.youku.demo.spouts;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Map;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
public class WordReader extends BaseRichSpout {
	private SpoutOutputCollector collector;
	private FileReader fileReader;
	private boolean completed = false;
	public void ack(Object msgId) {
		System.out.println("OK:"+msgId);
	}
	public void close() {}
	public void fail(Object msgId) {
		System.out.println("FAIL:"+msgId);
	}
	/**
	 * The only thing that the methods will do It is emit each
	 * file line
	 */
	public void nextTuple() {
		/**
		 * The nextuple it is called forever, so if we have been readed the file
		 * we will wait and then return
		 */
		if(completed){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				//Do nothing
			}
			return;
		}
		String str;
		//Open the reader
		BufferedReader reader = new BufferedReader(fileReader);
		try{
			//Read all lines
			while((str = reader.readLine()) != null){
				/**
				 * By each line emmit a new value with the line as a their
				 */
				this.collector.emit(new Values(str),str);
			}
		}catch(Exception e){
			throw new RuntimeException("Error reading tuple",e);
		}finally{
			completed = true;
		}
	}
	/**
	 * We will create the file and get the collector object
	 */
	public void open(Map conf, TopologyContext context,
			SpoutOutputCollector collector) {
		try {
			this.fileReader = new FileReader(conf.get("wordsFile").toString());
		} catch (FileNotFoundException e) {
			throw new RuntimeException("Error reading file ["+conf.get("wordFile")+"]");
		}
		this.collector = collector;
	}
	/**
	 * Declare the output field "word"
	 */
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields("line"));
	}
}

TopologyMain.java:

package com.youku.demo;
import com.youku.demo.bolts.WordCounter;
import com.youku.demo.bolts.WordNormalizer;
import com.youku.demo.spouts.WordReader;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
public class TopologyMain {
	public static void main(String[] args) throws InterruptedException {
        //Topology definition
		TopologyBuilder builder = new TopologyBuilder();
		builder.setSpout("word-reader",new WordReader());
		builder.setBolt("word-normalizer", new WordNormalizer())
			.shuffleGrouping("word-reader");
		builder.setBolt("word-counter", new WordCounter(),1)
			.fieldsGrouping("word-normalizer", new Fields("word"));
        //Configuration
		Config conf = new Config();
		conf.put("wordsFile", args[0]);
		conf.setDebug(true);
        //Topology run
		conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 1);
		LocalCluster cluster = new LocalCluster();
		cluster.submitTopology("Getting-Started-Toplogie", conf, builder.createTopology());
		Thread.sleep(2000);
		cluster.shutdown();
	}
}

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.youku.demo</groupId>
	<artifactId>demo-storm</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>demo-storm</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<compilerVersion>1.6</compilerVersion>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<!-- Repository where we can found the storm dependencies -->
		<repository>
			<id>clojars.org</id>
			<url>http://clojars.org/repo</url>
		</repository>
	</repositories>
	<dependencies>
		<!-- Storm Dependency -->
		<dependency>
			<groupId>storm</groupId>
			<artifactId>storm</artifactId>
			<version>0.8.0</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

words.txt:

storm
test
are
great
is
an
storm
simple
application
but
very
powerfull
really
StOrm
is
great

运行的时候需要配置参数:src/main/resources/words.txt 指定输入文件

运行命令

运行命令


日志输出:
运行日志

运行日志


会报好多zookeeper异常,还有最后的日志文件无法删除的异常,目前忽略了,O(∩_∩)O呵呵~

271  [main-SendThread(localhost:2000)] WARN  org.apache.zookeeper.ClientCnxn  - Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.SocketException: Address family not supported by protocol family: connect
	at sun.nio.ch.Net.connect(Native Method)
	at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)
	at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1050)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1077)
java.io.IOException: Unable to delete file: C:UsersThinkPadAppDataLocalTemp3fbb080f-e585-42e6-8b1b-d6ae024503acversion-2log.1
	at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1390)
	at org.apache.commons.io.FileUtils.cleanDirectory(FileUtils.java:1044)
	at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:977)
	at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1381)
	at org.apache.commons.io.FileUtils.cleanDirectory(FileUtils.java:1044)
	at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:977)
	at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1381)
	at backtype.storm.util$rmr.invoke(util.clj:413)
	at backtype.storm.testing$kill_local_storm_cluster.invoke(testing.clj:163)
	at backtype.storm.LocalCluster$_shutdown.invoke(LocalCluster.clj:21)
	at backtype.storm.LocalCluster.shutdown(Unknown Source)
	at com.youku.demo.TopologyMain.main(TopologyMain.java:33)

渐进学习hadoop

渐进式的学习Hadoop:
(1)先搭建一个单节点的 Hadoop平台,先将那些疑问放一边,先去学习如何搭建这个平台;
(2)尝试用Hadoop管理各类文件,尝试将数据存放于其非关系型数据库中,尝试编写一个MapReduce程序,通过些步骤,能够大概的认识到Hadoop是一个海量的数据、文件的存放平台,上面提供了各种通用的工具以帮助用户更好的去分析、应用与处理这些数据与文件;
(3)考虑一个问题:如果当前有一个任务交给你,去实现一个TB、乃至PB级数据的海量存取与快速查询,你最后如果实现了这一任务,其实就是实现了一个专用任务的Hadoop平台,考虑到未来有很多类似的任务,将你的专用Hadoop平台改造成通用性平台,以方便其他用户使用,那你可能就真正实现了一个类似于Hadoop的应用系统。用这样的思维去看待Hadoop可能会让用户理解的为更透彻,另外当用户对这个认识模糊时,大可以不用太担心,这多半是由于当前的实际工作可能还用不上,如果真碰到这样的大数据处理,通过思考就能很快理解Hadoop的好处。
(4)实现多节点的安装与部署,并尝试设置节点失效,看一下如何去管理与调度、监测任务的执行。
(5)实现大批量专用工具部署,并尝试实现1万个文件的存取、数千万数据的写入与查询,再去重新认识一下Hadoop。
(6)尝试在工作中开始实现Hadoop。

Storm实时计算平台

Twitter将Storm正式开源了,这是一个分布式的、容错的实时计算系统,它被托管在GitHub上,遵循 Eclipse Public License 1.0。Storm是由BackType开发的实时处理系统,BackType现在已在Twitter麾下。GitHub上的最新版本是Storm 0.8.0,基本是用Clojure写的。
Storm为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。 Storm也可被用于“连续计算”(continuous computation),对数据流做连续查询,在计算时就将结果以流的形式输出给用户。它还可被用于“分布式RPC”,以并行的方式运行昂贵的运算。 Storm的主工程师Nathan Marz表示:
Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比 Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的是你可以使用任意编程语言来做开发。
Storm的主要特点如下:
简单的编程模型。类似于MapReduce降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性。
可以使用各种编程语言。你可以在Storm之上使用各种编程语言。默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可。
容错性。Storm会管理工作进程和节点的故障。
水平扩展。计算是在多个线程、进程和服务器之间并行进行的。
可靠的消息处理。Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。
快速。系统的设计保证了消息能得到快速的处理,使用ØMQ作为其底层消息队列。
本地模式。Storm有一个“本地模式”,可以在处理过程中完全模拟Storm集群。这让你可以快速进行开发和单元测试。
Storm集群由一个主节点和多个工作节点组成。主节点运行了一个名为“Nimbus”的守护进程,用于分配代码、布置任务及故障检测。每个工作节 点都运行了一个名为“Supervisor”的守护进程,用于监听工作,开始并终止工作进程。Nimbus和Supervisor都能快速失败,而且是无 状态的,这样一来它们就变得十分健壮,两者的协调工作是由Apache ZooKeeper来完成的。
Storm的术语包括Stream、Spout、Bolt、Task、Worker、Stream Grouping和Topology。Stream是被处理的数据。Sprout是数据源。Bolt处理数据。Task是运行于Spout或Bolt中的 线程。Worker是运行这些线程的进程。Stream Grouping规定了Bolt接收什么东西作为输入数据。数据可以随机分配(术语为Shuffle),或者根据字段值分配(术语为Fields),或者 广播(术语为All),或者总是发给一个Task(术语为Global),也可以不关心该数据(术语为None),或者由自定义逻辑来决定(术语为 Direct)。Topology是由Stream Grouping连接起来的Spout和Bolt节点网络。在Storm Concepts页面里对这些术语有更详细的描述。
可以和Storm相提并论的系统有Esper、Streambase、HStreaming和Yahoo S4。其中和Storm最接近的就是S4。两者最大的区别在于Storm会保证消息得到处理。这些系统中有的拥有内建数据存储层,这是Storm所没有的,如果需要持久化,可以使用一个类似于Cassandra或Riak这样的外部数据库。
入门的最佳途径是阅读GitHub上的官方《Storm Tutorial》。 其中讨论了多种Storm概念和抽象,提供了范例代码以便你可以运行一个Storm Topology。开发过程中,可以用本地模式来运行Storm,这样就能在本地开发,在进程中测试Topology。一切就绪后,以远程模式运行 Storm,提交用于在集群中运行的Topology。
要运行Storm集群,你需要Apache Zookeeper、ØMQ、JZMQ、Java 6和Python 2.6.6。ZooKeeper用于管理集群中的不同组件,ØMQ是内部消息系统,JZMQ是ØMQ的Java Binding。有个名为storm-deploy的子项目,可以在AWS上一键部署Storm集群。关于详细的步骤,可以阅读Storm Wiki上的《Setting up a Storm cluster》
storm官网:
http://storm-project.net/
storm git:
https://github.com/nathanmarz/storm

体验云存储

体验“云存储”
Dropbox据说在分享文件的时候是有每日20G流量限制的,超过会封号;
腾讯的微云,我问过客服,说是没有,分享人数,下载次数,流量控制等限制;
QQ中转站有下载次数限制
百度网盘有版权问题,可能会分享失败
各种廉价及有吸引力的 云选择日益增多。但是通过3月19号公布一个Strategy Analytics调查显示,美国市场已被大公司开发的生态系统所霸占。研究发现Apple在硬件和服务上的融合已很大限度上成为这种生态系统的标杆,在该领域占主导地位;而Dropbox、Amazon和Google紧随其后。
Strategy Analytics调查了接近2300个连接终端后得出结论:Apple的iCloud和iTunes Match服务拥有了市场上27%的用户;其它取得了两位数成绩的公司有:Dropbox 17%、Amazon Cloud Drive 15%以及Google Drive的10%;而其它的竞争对手的用户占有率都未超过4%。
研究还发现云服务采用最高的人群为年轻人,特别是在20到24岁之间的青年;其中只有Apple云服务的女性用户比男性用户来的多,而其中音乐存储的采用率最高。有90%左右的Apple、Amazon及Google云用户都使用这些服务存储他们的音乐,即使Dropbox(区别于其它Apple等公司,并没有围绕着内容生态系统)服务的用户中有45%都来自音乐储存。Strategy Analytics指出Dropbox似乎准备在这一领域大展拳脚,这得益于 12月份收购的Audiogalaxy;Audiogalaxy是个音乐流及存储公司,使Dropbox可以快速的整合像本地音乐播放器这些功能。
Ed Barton —— Strategy Analytics数字媒体总监,说道:“音乐已经成为云战争的主要战场。”他指出,Google为争取客户给安卓设备提供了2万首免费音乐备份服务。与其竞争的服务同样提供了类似的小规模免费服务,不过它们通常是根据使用的空间收费。
音乐成为 云战争主战场已有多年之久,但是Barton指出:对流视频的需求可能会促成更深层的采用。也是出于这个原因,他非常看好好莱坞支持的Ultraviolet服务,根据该公司的调查:这个服务已经占据了市场上4%的用户份额,尽管这个服务因为出错率高和界面复杂激怒过很多初期用户。
在另一个需要注意的发现中,Samsung Music Hub占据了3%的美国云存储。这个韩国电子巨头一直追求着使Apple迅速崛起的软硬件协同效应,而它们扩张的云脚步正是实现这一目标的一部分。
微软在这一榜单上的缺席无疑是惹人注意的,该公司SkyDrive云服务上的文件已超10亿。Redmond也正致力将服务整合到最普及的产品,比如Office。Strategy Analytics并没有公布对这些公司调查的详细统计数据。
虽然有些公司还在讨论采用什么类型的云服务,甚至是在考虑是否采用云服务,但是云的采用还是成为了主流。通过研究发现,美国线上用户中有45%至少使用了一种云服务。
Barton说,虽然那些“2013年是云计算一年”的论调有些言过其实,但毫无疑问的是云存储已经成为数字平台的一个关键使用策略,而在2至3年内更将随处可见。

利用devstack在ubuntu上安装openstack

系统要求:ubuntu12.04 32位
安装git:

sudo apt-get install git

获取devstack脚本:

git clone https://github.com/openstack-dev/devstack.git

在当前用户目录下执行命令,否则会报没权限
进入devstack目录

cd devstack
./stack.sh

脚本执行过程需要按照提示设置几个密码,执行过程大概:
(1)下载并安装Openstack运行所需要的系统软件,大概包括一些python的组件、mysql、rabbitmq-server等
(2)下载openstack组件,包括nova 、keystone、glance、noVNC、horizon等
(3)下载并安装openstack源码所依赖的python库和框架
(4)安装openstack各组件
(5)启动各项服务
然后就是漫长到等待,需要看网络情况,经常装到一半没速度了,可以换用其他到Ubuntu 更新源。

Horizon is now available at http://172.16.95.187/
Keystone is serving at http://172.16.95.187:5000/v2.0/
Examples on using novaclient command line is in exercise.sh
The default users are: admin and demo
The password: 123456
This is your host ip: 172.16.95.187
stack.sh completed in 1961 seconds.

访问http://172.16.95.187/,输入用户名密码即可
http://devstack.org/

IaaS层实现思路

云计算,什么是云计算,它到底离我们有多远?
这些内容我已经在《云计算的定义和特征》中阐述过了,需要看的朋友可以再去翻出来看看。
这篇文章我们重点讨论IaaS
IaaS的使用者是谁?IaaS能提供怎样的服务?他们怎么利用提供的服务?
是研发人员,有了IaaS层以后,他们就不需要等待公司的流程,盼星星盼月亮似地等着审批机器。IaaS层提供资助服务,完全可以由使用者自助申请,通过云管理平台审批,而后得到想要的机器。这种是直接提供虚拟机。
还有一种场景,我的IaaS层在外面是看不到东西的,这里的IaaS层只是为内部的中间件提供一个可部署、易维护的一个环境,而用户使用的服务是中间件提供的。这种我们得到的服务是间接的,看不到摸不着的。
我们可以像想,在我的I层有一堆的PC Server ,每台PC Server上都有内存、CPU、硬盘这些重要组件。虚拟化带来的切割资源,将一个性能较好的机器,切分成相对性能较差的机器。
未完待续……

Hadoop云计算资料收集

Hadoop云计算资料收集,会陆续更新……
先说下我本人对各种资料、信息来源的看法:
1、书:有些书不错,必须得买,必须得深入的看,这种书比较少;但有些书,乍一看书目很不错,但内容多为浅尝辄止,没啥新意,看看书目就行了,作为查找资料的依据,自学的大纲,不买;垃圾书就不说了。
2、培训:任何事情都有好坏两方面,我对此的态度是不排斥,也不喜欢;好多培训课程在课程安排上还是不错的,因此在自学的时候可以参考培训学校安排的学习路线,参加不参加培训看个人基础,关键是自己知道自己应该学什么,而不是别人告诉你,你要学什么充分利用培训网站上的课程表,安排自学路线,还是不错的方法。充分利用培训学校的培训视频,找到自己需要的知识点,切记,前提一定是知道自己想要学什么;
任何东东都有两面性,取其精华去其糟粕,学好技术才是我们最终目标,看事物的时候不能一刀切!
希望资源失效的时候,大家提醒下,也好及时删除,如果有什么资源,也欢迎大家及时分享。


云计算相关:
北航云计算视频教程  http://soft.buaa.edu.cn/MC/show.asp?id=534
重点推荐张荣典老师的《云计算之前生今世与未来》http://www.huijiangtan.com/pubcontent1.php


Hadoop相关:
史密斯学院关于Hadoop一些资料(英文的)   http://cs.smith.edu/classwiki/index.php/Category:Hadoop
高负载低延迟:动态算法+Hadoop+AWS+NoSQL解析 http://www.csdn.net/article/2013-01-18/2813788-analyzing-billions-of-credit-card-transa
csdn Hadoop专题:http://subject.csdn.net/hadoop/
Mapreduce相关,介绍的内容很基础和比较底层:http://www.importnew.com/?s=hadoop%E6%95%99%E7%A8%8B
如何给Hadoop集群选择硬件:http://blog.cloudera.com/blog/2013/08/how-to-select-the-right-hardware-for-your-new-hadoop-cluster/


Java:
java异常处理:http://www.importnew.com/5616.html
tomcat的配置: http://blog.lihai.me/deploy-webapp-on-tomcat.html
调度系统Quartz快速入门:http://www.importnew.com/4107.html


开源相关:
图灵社区,正在翻译的《开源软件架构》http://www.ituring.com.cn/book/1143#jtss-tsina