2013年5月月 发布的文章

Hadoop知识整理

按照what、how、why整理了下文章,帮助大家快速梳理下hadoop知识:
what:
Hadoop的作用: http://tianhailong.com/hadoop%E7%9A%84%E4%BD%9C%E7%94%A8.html
hadoop到底能做什么?怎么用hadoop?: http://tianhailong.com/hadoop%E5%88%B0%E5%BA%95%E8%83%BD%E5%81%9A%E4%BB%80%E4%B9%88%EF%BC%9F%E6%80%8E%E4%B9%88%E7%94%A8hadoop%EF%BC%9F.html
Hadoop和云计算的关系: http://tianhailong.com/hadoop%E5%92%8C%E4%BA%91%E8%AE%A1%E7%AE%97%E7%9A%84%E5%85%B3%E7%B3%BB.html
hadoop和java的关系: http://tianhailong.com/hadoop%E5%92%8Cjava%E7%9A%84%E5%85%B3%E7%B3%BB.html
Hadoop10大应用: http://tianhailong.com/hadoop10%E5%A4%A7%E5%BA%94%E7%94%A8.html
Hadoop是分布式计算的未来: http://tianhailong.com/187.html
Hadoop发展历史: http://tianhailong.com/hadoop%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2.html
Hadoop大事记: http://tianhailong.com/hadoop%E5%A4%A7%E4%BA%8B%E8%AE%B0.html
Hadoop主要子项目: http://tianhailong.com/hadoop%E4%B8%BB%E8%A6%81%E5%AD%90%E9%A1%B9%E7%9B%AE.html
Hadoop, Hive和Scribe在运维方面的应用: http://tianhailong.com/hadoop-hive%E5%92%8Cscribe%E5%9C%A8%E8%BF%90%E7%BB%B4%E6%96%B9%E9%9D%A2%E7%9A%84%E5%BA%94%E7%94%A8.html
hadoop招聘: http://tianhailong.com/hadoop%E6%8B%9B%E8%81%98.html
how:
渐进学习hadoop: http://tianhailong.com/%E6%B8%90%E8%BF%9B%E5%AD%A6%E4%B9%A0hadoop.html
hadoop基础-Hadoop入门一: http://tianhailong.com/hadoop%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E7%82%B9.html
认识hdfs和MapReduce-Hadoop入门二: http://tianhailong.com/hadoop%E5%85%A5%E9%97%A8%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E7%82%B9%E4%BA%8C.html
HDFS开发MapReduce开发-Hadoop入门三: http://tianhailong.com/hadoop%E5%85%A5%E9%97%A8%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B8%89.html
hadoop在百度的应用: http://tianhailong.com/hadoop%E5%9C%A8%E7%99%BE%E5%BA%A6%E7%9A%84%E5%BA%94%E7%94%A8.html
Hadoop集群搭建–Hadoop安装: http://tianhailong.com/hadoop%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BAhadoop%E5%AE%89%E8%A3%85.html
why:
hdfs:hadoop分布式文件系统的架构和设计: http://tianhailong.com/hdfs%EF%BC%9Ahadoop%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%9E%B6%E6%9E%84%E5%92%8C%E8%AE%BE%E8%AE%A1.html

没有学位,通过这四步也能进Google

自从发表了《坚持编程:如何找到一份工程师工作》这篇文章,很多人问我在没有学位的情况下怎么获得在谷歌(Google)工作的机会。你通向成功之路或许会和我不一样,下面是我的故事。
我非常希望能上大学,我的理想大学是加利福尼亚大学洛杉矶分校(UCLA)。很不幸,我高中的 GPA 低的令人尴尬,只有2.45。所以实际上,我并没有随便选择一家大学。我在普渡大学盖莱默分校上的计算机科学课程,希望可以当交换生或者找到别的出路。差不多两个学期以后,后者发生了。我收到了一个不可拒绝的offer。
第一步:在你能做之前先装装样子。大学的时候,我在一家专门为本地企业建设网站小公司工作,时薪是12美金。在我的职业规划里,我从未想过做这样一份工作,但当时来看还不错。
我同时参与多个项目,身负重任,我选择埋头苦干,全力以赴。从这个过程中我获得了很多信任。同时,我尝试利用我不多的业余时间开发游戏。我去到一个 天主教会,向那里的管理人员请求提供我少量的钱和三个月时间来开发这个游戏,然后在网上销售。我绘制了漂亮的报表和颜色丰富的图片,向他们展示共享软件模型( shareware model )是怎么工作以及如何确切知道这会带来回报。实际上,我对于我将要做的东西还不是非常清楚,但是他们买了,也许是由于那些漂亮的颜色。
经过两个月的开发,我将Demo发布到网上。一个在加州刚刚起步的创业公司CodeFire发现我的Demo和他们的游戏如此相似,都是一个从上往 下看的太空射击游戏,都和SubSpace非常相似,除了3D部分。不幸的是,他们通过勒令停止通知函与我交涉。我只能给他们一个回复“当然可以,只要你们聘请我工作,我就马上停止”。他们马上给我发了offer。然后我就收拾行装去了加州。
第二步:和大师交朋友。这可能是最重要的事情。在你的领域里找到一位大师,让他们成为你的导师,不停的向他们学习。当我在Double Helix工作时,有一位大师叫 Nathan Hunt,他是我遇过最聪明的却又最谦卑的人。不管我问的问题如何的基础,他都极度耐心的一一解答。我至少上千次的走进他办公室,问一些诸如“我怎样才能平滑的将一个旋转矩阵插值到另外一个里面”,“我应该如何实现移动柱体的碰撞检测”的问题。几年以后,他晚我一个月加入了谷歌。
每一个导师都改变了我解决问题或者看待世界的方法,而这只有其中的一小部分。
第三步:填补不足。因为我没有一个正式的计算机学位,我清楚自己缺乏很多基础的理论知识。比如,我实现了一个物理引擎,但从未解决过动态规划的问题。为了填补这些空缺,我几乎实现了所有我见过或读过的数据结构与算法。这些虽然都已经有了,但是通过观察而知道其如何 工作,与通过实现而知道其为什么可行有着巨大差别。
完成以下几点:
至少掌握其中一门语言: C、 C++、Objective-C、Java、PHP、Python 或 Ruby。了解至少一门其他语言,熟悉Scala、Haskell 或者 Lisp。
学习数据结构。尝试实现其中的大部分。理解他们的时间复杂度。
解决编程问题。阅读下面的文章( Read this)和解决这里的大多数问题( solve many of these)。
为你的项目建立主页。(比如,编程框架、移动应用、网页应用、小游戏等)
第四步:找到自信。在离开印第安纳州6年以后,我已经通过多个平台发布了超过6个游戏。我渐渐觉得无聊,需要新的挑战。我申请了谷歌的职位,由于我没有学位,我想着如果我被聘请了,我就能成为梦寐已久的一名真正的工程师了。但是,我从未收到回信,对于这一点我感到一点都不意外。
一年以后,我再次提交了我的简历。而这一次,我把“教育”这一部分删除了。讽刺的是,这次一位招聘官给我打电话和我预约了一个电话技术面试。我咨询是否可以预约在两个星期以后,他同意了。我需要这一部分时间。我利用这段时间,尽最大努力将尽可能多的算法和数据结构塞到我的脑子里。我每天编码 12-14个小时,解决了几百道编程题。我慢慢沉迷进去了,直到我对谷歌面试的害怕变成了自信和兴奋。
我记得住在谷歌的每一次面试,每一次与他们的交锋。面试官都很健谈,我相信他们都看得出来我非常兴奋的迎接他们的问题。
我遇到的一些面试题如下:
给定一组2维点,计算出他们的轮廓线。这非常简单,我采用了非常一种通用的数据结构叫做最大堆。这道题有很多解决方法,这里有一个非常好的。( good one)
设计微软的画笔。这是目前为止最有趣的问题。我从画接口和类图开始,我提到了画笔桶(Paint Bucket),面试官让我实现它。幸运的是,多亏TopCoder,我闭着眼睛都知道如何实现一个迭代的,广度优先遍历的桶。
描述你的软件的长处。这是一道开放的讨论面试题。我说到了测试的类型和他们的重要性(单元测试,集成测试,验收测试)。我又说到了代码风格的一致性和可维护性等等。这些东西你可以在《代码大全》和 《Effective Java》找到。
我真正的享受每一轮面试和每一个扔给我的问题。如果我没有那样认真的准备,我现在肯定不是这个样子。面试完了以后,我感觉非常好。但是,我听说即使招聘委员组同意了给offer,拉里本人仍有权利否决。我担心一旦他看到我没有学位以后,我就完蛋了。
不过,这并没有发生,有一天我在Santa Clara吃着寿司午餐,我接到了电话,我非常热情的接受了Offer。那一天,我清楚的知道我不用再回到学校里去了。
胜利的战士先胜了再去战场,而失败的战士先上战场再去求胜。
喜欢或者讨厌这篇文章,都请让我知道。@guitardave24
经过5年学习和成长,我现在已经不再为谷歌干活了。
http://blog.jobbole.com/40257/

Base64编码

按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位为一个单元,对应某个可打印字符。三个字节有24个位,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据.
在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号「+」,斜杠「/」,一共64个字符,等号「=」用来作为后缀用途。
完整的base64定义可见 RFC 1421和 RFC 2045。编码后的数据比原始数据略长,为原来的。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6(因为)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个「=」;如果最后剩下一个输入数据,编码结果后加2个「=」;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个’=’号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。
在URL中的应用:
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充’=’号,并将标准Base64中的「+」和「/」分别改成了「-」和「_」,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将「+」和「/」改成了「!」和「-」,因为「+」,「*」以及前面在IRCu中用到的「[」和「]」在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将「+/」改为「_-」或「._」(用作编程语言中的标识符名称)或「.-」(用于XML中的Nmtoken)甚至「_:」(用于XML中的Name)。
其他应用:
Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
在LDIF档案,Base64用作编码字符串。
在设计BASE64编码的时候,我想设计人员最主要考虑了3个问题:
1.是否加密?
2.加密算法复杂程度和效率
3.如何处理传输?
加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”。即达到一眼望去完全看不出内容即可。
基于这个目的加密算法的复杂程度和效率也就不能太大和太低。和上一个理由类似,MIME协议等用于发送Email的协议解决的是如何收发Email,而并不是如何安全的收发Email。因此算法的复杂程度要小,效率要高,否则因为发送Email而大量占用资源,路就有点走歪了。
但是,如果是基于以上两点,那么我们使用最简单的恺撒法即可,为什么Base64看起来要比恺撒法复杂呢?这是因为在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送Email,这个问题就必须考虑!所以,单单靠改变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046。
基于以上的一些主要原因产生了Base64编码。

Java BASE64加密解密

Java BASE64加密解密 sun.misc包是Sun公司提供给内部使用的专用API,不建议使用。另外apache已经实现了一套:
参考org.apache.commons.codec.binary.Base64
下载地址:http://commons.apache.org/codec/download_codec.cgi

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * BASE64加密解密
 */
public class BASE64
{
    /**
     * BASE64解密
   * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }
    /**
     * BASE64加密
   * @param key
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }
    public static void main(String[] args) throws Exception
    {
        String data = BASE64.encryptBASE64("法证先锋 第二部".getBytes());
        System.out.println("加密前:"+data);
        //5rOV6K+B5YWI6ZSLIOesrOS6jOmDqA==
        byte[] byteArray = BASE64.decryptBASE64(data);
        System.out.println("解密后:"+new String(byteArray));
    }
}

利用HDFS java API增删改查操作

利用HDFS java API增删改查操作
在做这个实验的时候需要特别注意下面三个问题:
1、hdfs安全模式需要关闭 命令:./hadoop dfsadmin -safemode leave
2、工程中依赖的版本必须和集群的一致,否则也会报 version不一致错误
3、hadoop集群用户权限的问题,以及各个目录的作用
目前为什么会有这三个问题的原因待查!!!
未验证目前使用hadoop的版本(release-0.20.0)是否支持webhdfs,反正我是怎么都连接不上啊!!!
从这上面看,0.20.0 可能是不支持的
https://jira.springsource.org/browse/IMPALA-15?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
Serengeti Distro:
Apache Hadoop:1.0.1
GreenPlum HD:1.1(Apache Hadoop 1.0.0)
CloudEra: CDH3(Apache Hadoop 0.20.2, WebHDFS is not supported in this version)
Hortonworks: 1.0.7 (Apache Hadoop 1.0.2)
步骤如下:
工程结构,如图:

工程结构

工程结构


上代码 O(∩_∩)O哈哈~
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.yun.hdfs</groupId>
	<artifactId>hdfs</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<appendAssemblyId>false</appendAssemblyId>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>com.yun.hdfs.WangPan</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>assembly</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-core</artifactId>
			<version>0.20.2</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
	</dependencies>
</project>

WangPan.java 主方法用于调用:

package com.yun.hdfs;
import java.io.IOException;
public class WangPan {
	/*** 运行结果描述. */
	private static String result = "";
	public static void main(String[] args) {
		try {
			// 判断命令输入是否正确
			if (args[0] != null && !"".equals(args[0]) && args.length > 0) {
				if ("upload".equals(args[0])) {
					result = "upload:" + WangPanUtils.uploadFile(args);
				} else if ("delete".equals(args[0])) {
					result = "delete:" + WangPanUtils.deleteFile(args);
				} else if ("query".equals(args[0])) {
					if (WangPanUtils.listFile(args) == null) {
						result = "query:fail!";
					} else {
						result = "query:success";
					}
				} else if ("read".equals(args[0])) {
					result = "read:" + WangPanUtils.readFile(args);
				} else {
					System.out.println("sorry,wo have no this service!");
				}
				System.out.println(result);
			} else {
				System.out.println("fail!");
				System.exit(1);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

WangPanUtils.java增删改查:

package com.yun.hdfs;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class WangPanUtils {
	/**
	 * 上传文件. java -jar /root/hdfs-0.0.1-SNAPSHOT.jar upload /root/test-hdfs.txt
	 * hdfs://hadoopm:9000/user/root/upload/12390po.txt
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static String uploadFile(String[] args) throws IOException {
		String loaclSrc = args[1];
		String dst = args[2];
		if (args.length < 3) {
			return "fail";
		}
		InputStream in = new BufferedInputStream(new FileInputStream(loaclSrc));
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		OutputStream out = fs.create(new Path(dst));
		IOUtils.copyBytes(in, out, 4096, true);
		return "success";
	}
	/**
	 * 查询文件列表. java -jar /root/hdfs-0.0.1-SNAPSHOT.jar query
	 * hdfs://hadoopm:9000/user/root/
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static Path[] listFile(String[] args) throws IOException {
		if (args.length < 2) {
			return null;
		}
		String dst = args[1];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		FileStatus[] statu = fs.listStatus(new Path(dst));
		Path[] listPaths = FileUtil.stat2Paths(statu);
		return listPaths;
	}
	/**
	 * 删除文件.
	 * java -jar /root/hdfs-0.0.1-SNAPSHOT.jar delete hdfs://hadoopm:9000/user/root/upload/12390po.txt
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static String deleteFile(String[] args) throws IOException {
		if (args.length < 2) {
			return "fail";
		}
		String fileName = args[1];
		Configuration config = new Configuration();
		FileSystem hdfs = FileSystem.get(URI.create(fileName), config);
		Path path = new Path(fileName);
		if (!hdfs.exists(path)) {
			return "fail";
		}
		boolean isDeleted = hdfs.delete(path, false);
		if (isDeleted) {
			return "success";
		} else {
			return "fail";
		}
	}
	/**
	 * 读取文件.
	 * java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read hdfs://hadoopm:9000/user/root/upload/123.txt /root/test-readfile898.txt
	 *
	 * @param args
	 * @return
	 * @throws IOException
	 */
	public static String readFile(String[] args) throws IOException {
		if(args.length < 3){
			return "fail";
		}
		String dst = args[1];
		String newPath = args[2];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		FSDataInputStream hdfsInStream = fs.open(new Path(dst));
		OutputStream out = new FileOutputStream(newPath);
		byte[] ioBuffer = new byte[1024];
		int readLen = hdfsInStream.read(ioBuffer);
		while (-1 != readLen) {
			out.write(ioBuffer, 0, readLen);
			readLen = hdfsInStream.read(ioBuffer);
		}
		out.close();
		hdfsInStream.close();
		fs.close();
		return "success";
	}
}
/**
	 * 创建文件夹.
	 * java -jar /root/hdfs-0.0.1-SNAPSHOT.jar mkdir hdfs://hadoopm:9000/user/root/upload/test909
	 *
	 * @return
	 * @throws IOException
	 */
	public static String mkdir(String[] args) throws IOException{
		if(args.length < 2){
			return "fali";
		}
		String dst = args[1];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst), conf);
		Path path = new Path(dst);
		if (fs.exists(path)) {
			return "fail";
		}
		fs.mkdirs(path);
		return "success";
	}

PS:需要注意的是,我们需要把这个工程利用maven打包成一个可运行的jar包,使用如下命令:

打包命令

打包命令


执行命令在每个方法注释上写明了,执行效果如下:
增删改查效果

增删改查效果


还需要访问 http://hadoopm:50070/ -> Browse the filesystem 查看hdfs文件操作是否真的成功
web hdfs

web hdfs

curl命令

发现个好东东:curl。curl是利用URL语法在命令行方式下工作的文件传输工具。
它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。
curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
Windows操作系统下的网络蚂蚁,网际快车(FlashGet)的功能它都可以做到。准确的说,curl支持文件的上传和下载,所以是一个综合传输工具,但是按照传统,用户习惯称curl为下载工具。
获得页面
使用命令:curl http://curl.haxx. se
这是最简单的使用方法。用这个命令获得了http://curl.haxx. se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将不显示文件头部,即HTML文档的header。要全部显示,请加参数 -i,要只显示头部,用参数 -I。任何时候,可以使用 -v 命令看curl是怎样工作的,它向服务器发送的所有命令都会显示出来。为了断点续传,可以使用-r参数来指定传输范围。
获取表单
在WEB页面设计中,form是很重要的元素。Form通常用来收集并向网站提交信息。提交信息的方法有两种,GET方法和POST方法。先讨论GET方法,例如在页面中有这样一段:

<form method=”GET” action=”junk.cgi”>
<input type=text name=”birthyear”>
<input type=submit name=press value=”OK”>
</form>

那么浏览器上会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单就用GET方法向服务器提交文本框的数据。
例如原始页面是在 www.hotmail. com/when/birth.html看到的,然后您在文本框中输入1905,然后按OK按钮,那么浏览器的URL现在应该是:“www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK”
对于这种网页,curl可以直接处理,例如想获取上面的网页,只要输入:
curl “www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK”
就可以了。
表单用来提交信息的第二种方法叫做POST方法,POST方法和GET方法的区别在于GET方法使用的时候,浏览器中会产生目标URL,而POST不会。类似GET,这里有一个网页:

<form method=”POST” action=”junk.cgi”>
<input type=text name=”birthyear”>
<input type=submit name=press value=”OK”>
</form>

浏览器上也会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单用POST方法向服务器提交数据。
这时的URL是看不到的,因此需要使用特殊的方法来抓取这个页面:
curl -d “birthyear=1905&press=OK” www.hotmail. com/when/junk.cgi
这个命令就可以做到。
1995年年末,RFC 1867定义了一种新的POST方法,用来上传文件。主要用于把本地文件上传到服务器。此时页面是这样写的:

<form method=”POST” enctype=’multipart/form-data’ action=”upload.cgi”>
<input type=file name=upload>
<input type=submit name=press value=”OK”>
</form>

对于这种页面,curl的用法不同:
curl -F upload=@localfilename -F press=OK URL
这个命令的实质是将本地的文件用POST上传到服务器。
有关POST还有不少用法,用户可以自己摸索。
使用PUT
HTTP协议文件上传的标准方法是使用PUT,此时curl命令使用-T参数:
curl -T uploadfile www.uploadhttp. com/receive.cgi
有关认证
curl可以处理各种情况的认证页面,例如下载用户名/密码认证方式的页面(在IE中通常是出现一个输入用户名和密码的输入框):
curl -u name:password www.secrets. com
如果网络是通过http代理服务器出去的,而代理服务器需要用户名和密码,那么输入:
curl -U proxyuser:proxypassword http://curl.haxx. se
任何需要输入用户名和密码的时候,只在参数中指定用户名而空着密码,curl可以交互式的让用户输入密码。
引用
有些网络资源访问的时候必须经过另外一个网络地址跳转过去,这用术语来说是:referer,引用。
对于这种地址的资源,curl也可以下载:
curl -e http://curl.haxx. se daniel.haxx. se
指定用户端
有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。
此时curl可以把自己“伪装”成任何其他浏览器:
curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” URL
这个指令表示curl伪装成了IE5.0,用户平台是Windows 2000。(对方服务器是根据这个字串来判断客户端的类型的,所以即使使用AIX也无所谓)。
使用:
curl -A “Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)” URL
此时curl变成了Netscape,运行在PIII平台的Linux上了。
COOKIES
Cookie是服务器经常使用的一种记忆客户信息的方法。如果cookie被记录在了文件中,那么使用命令:
curl -b stored_cookies_in_file www.cookiesite. com
curl可以根据旧的cookie写出新cookie并发送到网站:
curl -b cookies.txt -c newcookies.txt www.cookiesite. com
加密HTTP
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
curl https://that.secure.server. com
http认证
如果是采用证书认证的http地址,证书在本地,那么curl这样使用:
curl -E mycert.pem https://that.secure.server. com

没有云的话 大数据就是个作坊by王坚

王坚,阿里巴巴最富争议性的人物之一,爱者极爱,恨者极恨。
5月12日,我和MTC的朋友,在杭州发起并主持了一场关于云计算的沙龙,虾米的思践聊了云音乐,快的打车陈伟星聊了云时代的产品设计,短趣网王强宇聊了云时代的创业,当然少不了王坚聊一聊他对云计算的看法。
当天,青龙老贼发了一段王坚的部分观点,遭遇了他开通微信公众号以来最强烈的退粉,也激起了圈内人的各种讨论,这就是王坚的“影响力”。
我把王坚的分享做了个详细版的梳理,里面涉及了阿里云的定位、对大数据的反思、对APP创新的不看好,信息量很大,你可以感受一下。
一、无人机是大数据的典型
我热爱和平,但一讲到云计算和大数据,我想到的两个例子,都跟战争有关。
一个例子是,《世界是平的》作者去前线,看了现场的指挥官,发现西点军校应该重新办了。因为一个连排级的军官,只要一个电话,航母上的飞机就过来了。这放在以前的战争里是不会发生的,一个连排级军官能够动用的战争资源非常有限。今天,其实一个连排级的军官需要的训练和过去的军长师长是一样的。
经常有人问,如果有一定的基础设施,我能不能改变世界。在以前,只有国家主席可以做,今天一个人可以做的比主席还能多。因为有了云计算。
另外一个例子是,有人和我吹牛,说世界上大数据用得最好的就是无人机。前几天美国还在开会讨论为什么要租用中国的卫星,就是因为它自己的数据不够。无人机就是非常典型的一个创新,以前仗不是这么打的,今天有了大数据后就变了。
所以,云计算可以让你做以前不能做的事情,做以前不能做的规模。
二、我们的客户才是最会用数据的人
阿里云最早成立的时候,我们说自己是数据分享第一平台,对于这个定位,我自己觉得还蛮超前的。
阿里巴巴最早在讨论的时候,我们说为什么提数据,不提信息,这是一个很关键的事情。IBM会说数据没有用,知识才有用,所以这个定位很关键。
只要一谈到数据,我们其实就把自己定位在平台上了。我们想象我们的客户是把数据用到最好的人,而不是我们自己。
今天,最成功的数据公司就是谷歌。谷歌拿了全世界每个人都有的数据,就是web,它就靠自己的处理能力,做成了世界上最大的生意。谷歌初期的时候,它有的数据别人也有,只是别人没有他的处理能力和思想。
数据就是数据,只是要有人把他做成生意。
所以我们定位自己的时候,数据就是数据,这个是最基本的东西,有人比你更聪明,会把这个事情做成重要的生意。
今天的数据远远超过以前WEB的数据,所以可以想象的生意也会多很多很多,所以肯定可以比以前做得更大。
以前也没人知道数据在哪里,直到谷歌把他变成一个搜索,有办法把广告引导搜索里面。今天看来这个很简单,放当初很难,因为要把大家都有的东西,做成一个挣钱的东西,当时没几个人想清楚的,否则微软、雅虎也都不会把雅虎外包给别人。
三、“大数据”叫错了
之前田溯宁在北京组织了一个活动,请了《大数据》的作者,大家开了一个很小的研讨会。
我分享时说,其实大数据是叫错掉的,“大数据”没有反应这个问题最本质的东西。
其实大数据很早以前就有,只是光只有数据大是没有用处的。世界上最大的数据估计和互联网一点关系都没有,欧洲对撞实验室做一次碰撞的数据,可能一辈子都做不完,最大的数据估计在那里。
今天的数据不是大,真正有意思的是数据变得在线了,这个恰恰是互联网的特点。所有东西在线这个事情,远远比“大”更反映本质。
像快的打车要用一个交通的数据,如果这些东西不在线,是没有用的。
为什么今天的淘宝数据值钱,因为他在线了。写在磁带、写在纸上的数据,根本没有用。
反过来讲,在线让数据搜集变得非常容易。过去美国谁要做总统,需要做盖勒普调查,去街上拦2000个人,在纸上打个勾,预测就很准了。现在不用做这个事情,只要在twitter上分析每个人发的东西,就可以知道总统会是谁了。
而且盖勒普调查做完之后很难快速影响社会,现在数据可以反过来快速影响社会。就像打车软件,如果要影响出租车司机,可能比出租车公司更大,原因就是数据在线了。
有时候,一些石油、地质之类的公司来跟我讲大数据,我就想不通这算不算大数据。他们的数据多是肯定的,但是他们的数据不在线,没有意义。
四、数据比功能更重要
产品我是不太懂的,阿里云的产品做得那么不好,都是我的责任,这个得求大家原谅。
但吃了很多苦头后,对于产品心得还是有的。
目前我没有看到一个产品和数据结合得很好。非互联网时期的产品,功能一定是它的价值,今天互联网的产品,数据一定是它的价值。
做航旅信息的产品,出了很多款。最近我看到出了一个“航旅纵横”,我用的比较多,我也不知道产品好不好,反正数据很好,他可以告诉你前一个航班发生了什么事情。
过去的软件,很多功能超出数据的重要性,但我相信,接下来,数据比功能会更重要。互联网人应该会能理解这个说法。
我和马云开玩笑说,阿里巴巴对数据的理解深度,不会超过苏宁对电子商务的理解。我的意思其实是,机会在哪里,大家都没搞清楚。
前几天我在北京碰到叶凯(京玩蟹科技有限公司CEO),他说游戏做来做去,发现数据是最重要的东西,在几个机房里数据拷来拷去很痛苦。
我猜测,他理解游戏的话,完全靠直觉已经不够了,数据可以帮他做这个事情。就好像一个人做在室内用数据来开飞机,光是训练飞行员的成本都不知道降低多少,这和用数据去改进游戏是异曲同工的。
五、云计算是个信任生意
我看云计算的时候,突然发现,云计算是个信任生意。包括虾米,短趣,能搬到阿里云,都是一个信任。
中国是全世界最早用纸币的国家。一张纸上盖个章,就让人相信是财富,这需要极大勇气的。今天,我们反而大大落后了,我们不相信信用卡,把信用卡当借记卡在用了,这是很要命的地方。
有人说他要做三年赚200亿美金(的互联网项目),他还要依靠别人(的云计算服务),他要相信这一点,是很了不起的。
我觉得,没有这个勇气,是不可能创新的。中国今天是有这样的机会。
我这里有个很自豪的案例。今天全国中国的药品,都有一个条形码,它需要去追踪每个药到了哪个批发商,到了哪个零售商,到了哪个医院,到了哪个患者,这个东西是个很重要的东西。现在这个东西就在阿里云上面,350万亿盒的数据都在上面。将来你跑到医院,自然能知道哪个是真药假药,也就是说,原来乱七八糟的事情就没了。这个是很大的创新。以前这些数据不在线的时候,你根本不敢去想,现在,你可以做很多的事情了。
另外一个案例,保险是一个很传统的行业。开一个保险公司,必须要开办事处。每人敢说,现在办一个保险,可以不签一个书面的东西。但是,可能今年下半年,中国会出一家保险公司,这是全世界第一家没有办事处的保险公司。不需要在纸上签任何东西,在线就能做完所有事情。
按我的理解,云计算能做好的话,创新机会非常大。
六、做APP,是在别人花园弄点盆栽
我觉得,移动互联网的创新,可以超越APP创新的范畴。
今天APP上的创新,有点像在人家花园里种点小花。因为苹果和安卓已经圈了一个花园,你种点花种点草是没有问题的,就像是去花鸟市场买点盆栽,反正是死也死不了活也活不好。
但是你要做点有生命力的东西,还是有挑战的。你要跑到大森林里,才能做有生命力的东西。否则叫你下架就下架,你会觉得还是有问题的。
当然,那个花园是一个很好的环境,也有人来看。但是在中国做生态的话,我们还是可以做有革命性的东西。
具体是什么,我们也真不知道。
七、有了施乐,才有苹果
我们做云计算最大的挑战是什么,就是我们真不懂。
这是一个无中生有的行业,我们过去只是在书上读到过的。是靠大家的互相配合、交互才能做起来。
我觉得应该办一个互联网博物馆。今天大家都看到了结果,没看到过程,这样的国家是很难创新。
大家可能不知道,大概百分之一百的鼠标都在中国生产,大部分也在中国消费,很多技术也在中国。很少有人去问,为什么有个东西要叫鼠标,第一个鼠标出来的时候是很丑陋的木头做的。
今天大家看到有个很漂亮的手机,叫做iphone,有个很好的操作系统,有个很好的appstore,大家可能没想过,这东西怎么来的。我早上在看一个关于美国八十年代经济的片子,其中采访了乔布斯,他说,如果不被苹果赶走,可能不会发生后面的事情。如果当时乔布斯没被赶走,没有一赌气去做NeXT,没有被买回来作为ios的基础的话,是不会有今天的苹果的。
所以,这里面的机缘巧合是很难计划的。
我要抱歉的是,阿里云是肯定要做好的,这个吃苦过程肯定逃不掉。
有一个八卦,苹果先做麦金塔,微软随后出了视窗,苹果就告微软抄袭。盖茨就和乔布斯说,我们就别互相搞了,其实我们都偷了施乐的东西。施乐没做大,但做出了很大的贡献。
中国的环境里没有施乐这样的公司,自然而然就不要想出苹果这样的公司。
我想说,就算各位创业者和施乐一样做点死不死活不活的东西,也很有意义。
八、不是搜集什么数据,而是做什么服务
今天的手机的传感器,和巡航导弹的传感器差不多。它能搜集到的东西很多,但是没有产生多大价值。
我觉得,数据搜集这件事,已经没有多大创新了,只要你想得到,我们一定能做得到。我觉得真正的创新,是你在这上面能够做什么,这还没有人弄懂。
这是一个鸡和蛋的问题,如果没有人能够用得好,那后面的东西不会发生。
最早的时候,有人会说,基于位置的服务什么的。但是到了今天,依然没有人知道了位置后,把服务做好。我觉得,这是最大的挑战。
九、云计算这名字有歧义
云计算是工业时代的电,大数据就是福特生产线,云存储就是钢铁工业。
也就是说,没有钢铁,就没有电,就不会有大规模工业化生产。没有云计算,大数据不会出来,如果美云计算没有解决云存储的问题,也不会出来。
我觉得云计算这名字的歧义在于,我们说这个的时候,其实包括了云计算、大数据、云存储等等所有的东西。
大数据,是我今天能想到的,那条能起来的福特生产线。到了最后,大家应该会忘记了云计算,只记得福特了。所以我说,看得见的前端,看不见的后台。
我不相信有人说,我做大数据,但是没有云的,那就是小作坊。
十、千万不要想着拿数据去改进业务
今天的银行,都不会是靠大数据起来的公司。银行靠什么处理数据,靠IBM。你可以算出来他做数据的成本,他处理数据产生的价值,可能都无法抹平处理数据的成本。
数据真正了不起的地方,是靠小的成本,去产生有价值的东西。
并不是说,有数据的地方,就会有大数据业务的存在。
阿里巴巴在数据上做的最好的是金融,但金融不等于银行。阿里金融做小贷的事情,恰恰是银行做不了的。银行没有这个数据,银行做信用评级的成本极高,银行不做小的贷款。
阿里金融每天贷10块钱,100块钱的人多得很。有个贷1块钱的客户,写了个感谢信,说这辈子从来没有人借给他一块钱,突然有人借他1块钱,他就觉得人生从此被尊敬了。
你千万不要想着拿数据去改进一个业务,这不是大数据。你一定是去做了一件以前做不了的事情。
亚马逊是全球做推荐最好的业务,这可以算是大数据的早期,但现在它每天想着怎么把推荐做得更好,我觉得这件事情一定没有希望。
http://www.techweb.com.cn/people/2013-05-14/1296347.shtml

js的Prototype属性解释及常用方法

函数:原型
每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。
prototype的定义
你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在。例子:
Example PT1
CODE:

function Test()
{
}
alert(Test.prototype); // 输出 "Object"

给prototype添加属性
就如你在上面所看到的,prototype是一个对象,因此,你能够给它添加属性。你添加给prototype的属性将会成为使用这个构造函数创建的对象的通用属性。
例如,我下面有一个数据类型Fish,我想让所有的鱼都有这些属性:livesIn=”water”和price=20;为了实现这个,我可以给构造函数Fish的prototype添加那些属性。
Example PT2
CODE:

function Fish(name, color)
{
this.name=name;
this.color=color;
}
Fish.prototype.livesIn="water";
Fish.prototype.price=20;

接下来让我们作几条鱼:
CODE:
var fish1=new Fish(“mackarel”, “gray”);
var fish2=new Fish(“goldfish”, “orange”);
var fish3=new Fish(“salmon”, “white”);
再来看看鱼都有哪些属性:
CODE:

for (int i=1; i<=3; i++)
{
var fish=eval_r("fish"+i);   // 我只是取得指向这条鱼的指针
alert(fish.name+","+fish.color+","+fish.livesIn+","+fish.price);
}

输出应该是:
CODE:

"mackarel, gray, water, 20"
"goldfish, orange, water, 20"
"salmon, white water, 20"

你看到所有的鱼都有属性livesIn和price,我们甚至都没有为每一条不同的鱼特别声明这些属性。这时因为当一个对象被创建时,这个构造函数将会把它的属性prototype赋给新对象的内部属性__proto__。这个__proto__被这个对象用来查找它的属性。
你也可以通过prototype来给所有对象添加共用的函数。这有一个好处:你不需要每次在构造一个对象的时候创建并初始化这个函数。为了解释这一点,让我们重新来看Example DT9并使用prototype来重写它:
用prototype给对象添加函数
Example PT3
CODE:

function Employee(name, salary)
{
this.name=name;
this.salary=salary;
}
Employee.prototype.getSalary=function getSalaryFunction()
{
return this.salary;
}
Employee.prototype.addSalary=function addSalaryFunction(addition)
{
this.salary=this.salary+addition;
}

我们可以象通常那样创建对象:
CODE:

var boss1=new Employee("Joan", 200000);
var boss2=new Employee("Kim", 100000);
var boss3=new Employee("Sam", 150000);

并验证它:
CODE:

alert(boss1.getSalary());   // 输出 200000
alert(boss2.getSalary());   // 输出 100000
alert(boss3.getSalary());   // 输出 150000

这里有一个图示来说明prototype是如何工作的。这个对象的每一个实例(boss1, boss2, boss3)都有一个内部属性叫做__proto__,这个属性指向了它的构造器(Employee)的属性prototype。当你执行 getSalary或者addSalary的时候,这个对象会在它的__proto__找到并执行这个代码。注意这点:这里并没有代码的复制(和 Example DT8的图表作一下对比)。

js实现hashmap

js实现hashmap ,项目中遇到了要在js中使用java hashmap的功能,找到一个不错的JS实现,
感谢lujc:

/***
 * js 实现hashmap  功能  lujc
 * 常用功能实现
 * @return
 */
function HashMap(){
	this.length = 0;
	this.maxLength = Number.MAX_VALUE;
	this.container = {};
}
HashMap.prototype.put = function(objName,objValue){
	try{
		if(this.length >= this.maxLength)
			throw new Error("[Error HashMap] : Map Datas' count overflow !");
		if(objName != ""){
			for(var p in this.container){
				if(p == objName){
					this.container[objName] = objValue;
					return ;
				}
			}
			this.container[objName] = objValue;
			this.length ++ ;
		}
	}catch(e){
		return e;
	}
};
HashMap.prototype.get = function(objName){
	try{
		if(this.container[objName])
			return this.container[objName];
	}catch(e){
		return e;
	}
};
HashMap.prototype.contains = function(objValue){
	try{
		for(var p in this.container){
			if(this.container[p] === objValue)
				return true;
		}
		return false;
	}catch(e){
		return e;
	}
};
HashMap.prototype.remove = function(objName){
	try{
		if(this.container[objName]){
			delete this.container[objName];
			this.length -- ;
		}
	}catch(e){
		return e;
	}
};
HashMap.prototype.pop = function(objName){
	try{
		var ov = this.container[objName];
		if(ov){
			delete this.container[objName];
			this.length -- ;
			return ov;
		}
		return null;
	}catch(e){
		return e;
	}
};
HashMap.prototype.removeAll = function(){
	try{
		this.clear();
	}catch(e){
		return e;
	}
};
HashMap.prototype.clear = function(){
	try{
		delete this.container;
		this.container = {};
		this.length = 0;
	}catch(e){
		return e;
	}
};
HashMap.prototype.isEmpty = function(){
	if(this.length === 0)
		return true;
	else
		return false;
};
HashMap.prototype.runIn = function(fun){
	try{
		if(!fun)
			throw new Error("[Error HashMap] : The paramer is null !");
		for(var p in this.container){
			var ov = this.container[p];
			fun(ov);
		}
	}catch(e){
		return e;
	}
};