分类 Hadoop 下的文章

Hadoop学习新人必看

Hadoop新人必看:
新人困惑:
大家对整个云计算没什么感觉,根本就不理解为啥hadoop这么设计,hadoop和云计算是什么关系 只是听人说 好
但是好在哪里 根本不知道
下面给出一个简易入门步骤:
1、推荐看下 张荣典的视频
《云计算之前生今世与未来》,视频地址:http://tianhailong.com/hadoop-forums/topic/hadoop%E8%B5%84%E6%96%99%E6%B1%87%E6%80%BB
先补习下云计算知识 弄清楚啥叫云计算 都分为那些层?
2、明确了云计算是个什么东东后 然后再弄清楚hadoop是干什么用的 hadoop位于云计算的哪个层里 起到什么作用
hadoop包含哪些组件,每个组件提供什么功能,组件与组件之间的关系是什么?
3、然后再开始搭建Hadoop集群
写mapreduce的helloworld
然后再开始装hbase、zookeeper等 挨个实现helloworld
Hadoop集群搭建教程:http://tianhailong.com/hadoop%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E8%AF%A6%E7%BB%86%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B.html
4、需要准备的知识:任何语言的编程经验+java(最好会)+云计算知识背景(大数据知识背景)+linux安装操作+虚拟机知识
必须先记在心里的东西:
1、cygwin只是模拟了linux环境
2、hadoop必须安装在linux环境上
3、mapreduce程序开发直接就在window上开发即可
4、mapreduce程序的运行:可以把写好的程序打成jar包 放到hadoop集群上 执行hadoop命令(就像大家安装完 验证集群是否正常运行那样 ”计算圆周率“一样)
5、 我们学的是hadoop 而不是整环境 ,可以先把环境的问题绕过
6、刚开始千万别用eclipse连接hadoop集群
7、如果你说6的理由是测试方便,那我告诉你,写junit更方便

台湾国网中心Hadoop实验集群

从网上找到了好东西,还是台湾人民好啊,搭建好的Hadoop集群,开放了公共服务 http://hadoop.nchc.org.tw/ 对于想学习hadoop编程,又苦于没有机器,你们有福啦 O(∩_∩)O哈哈~
这是他们的公告

  1. 歡迎至 forum.hadoop.tw 或 臉書粉絲團 進行討論
  2. 歡迎加入 公告群組,以利接收即時公告事宜
  3. 初學者請參閱線上教學: Hadoop 觀念篇 ,
    實作步驟請參閱以下三個連結:
    帳號申請 | HDFS 練習 | MapReduce 練習 ]
  4. 本叢集所採用的 Hadoop 版本是 0.20.1,寫程式時請參考 javadoc
  5. 倘若貴單位不允許 SSH 連線,或有 PROXY 限制,請改連https://hadoop.nchc.org.tw 並採用系統帳號密碼(hXXXX)登入。至於HDFS 與 MapReduce 也請請點選對應連結存取。

本叢集純為實驗用途,無法保證7×24服務品質
重要數據資料請務必另行備份,謝謝!
重要運算工作亦請考慮使用其他付費平台

家目錄空間吃緊中,請盡量上傳至HDFS後,
清除家目錄檔案,謝謝!

若有公用資料集運算需求,請置於
hdfs://hadoop.nchc.org.tw/pub,謝謝!

hadoop集群服务

hadoop集群服务


1、先注册账号:
http://hadoop.nchc.org.tw/new_register.php
注册

注册


2、邮箱激活
激活邮件

激活邮件


3、一会你会收到SSH地址、用户名和密码
SSH账号密码

SSH账号密码


4、登录后进入界面,就可以运行计算π的那个示例啦(注意:浏览器得支持java运行才能看到这个界面),或者使用SSH客户端输入地址、用户名密码链接到Hadoop集群, O(∩_∩)O哈哈~
计算π1

计算π1


计算π2

计算π2

Hadoop集群搭建详细简明教程

这份教程是最简版、也是最详细版,按照步骤一步步做,应该能达到效果,这里面一点理论都没有提到,请大家在熟悉相关内容后,自行学习必要的理论。欢迎访问博客,交流沟通。
内容主要包括:
Linux操作系统安装
Hadoop集群环境安装、配置
Hadoop集群搭建验证
Hadoop开发环境搭建
MapReduce程序如何测试
Hadoop源码阅读
说明
文档下载地址:http://pan.baidu.com/share/link?shareid=495136&uk=772112791
在Hadoop云计算群300165122已经发布了,有同学按照文档已经搭建过了。
下边为文档,建议使用火狐浏览器!
[crocodoc width=”700″ height=”900″]

Source Insight 3.5查看hadoop源码

先说一下为什么要研究Source Insight的使用
最近打算看下hadoop的源码,在网上看了下,一般都是在vmware上安装linux虚拟机,搭建一堆组件,编译hadoop源码,但是我是为了“读”hadoop源码,而不想编译。
把hadoop源码从svn下checkout出来,到eclipse里,不编译四处都是红叉,看着难受,O(∩_∩)O哈哈~,因此,决定研究下Source Insight。
1、新建文件夹”hadoop源码“,从svn检出hadoop源码到该文件夹,svn地址 http://svn.apache.org/repos/asf/hadoop/common/tags/release-1.0.3
2、打开Source Insight,点击菜单“Porject→New Project”
3、输入工程名,选择刚才新建的”hadoop源码“文件夹,将工程信息保存在该文件夹下。
4、下一步是选择是否只为该工程单独设置还是全局设置,这里选默认,点击OK即可。
5、选中hadoop目录下的src文件夹,选择”add tree“,就将所有代码添加到工程里。
6、所有文件都加入到工程后,点击close,关闭对话框。
7、双击右侧区的“File Name区”中的文件即可打开该文件。共有4个区:左侧显示该文件中的所有变量、函数、包含文件的名称(双击该区的任意一项,会在中间区域显示出它的实体);中间区显示代码的内容;右侧区显示整个工程中的文件;最下方的区域为关联区,当鼠标双击中间区域的某个函数后,在下方关联区会立刻显示该方法的实体。
 

source insight

source insight

window下Hadoop开发环境的搭建

好多人问我Windows下怎么搭建Hadoop开发环境,说句老实话,这个问题其实很简单,你是怎么开发java项目的,就怎么写mapreduce程序就OK。但是好多培训视频都给搞复杂了,一阵安装cygwin,一阵又搞什么eclipse连接hadoop集群,我对此的评论用一句话概括:脱裤子放屁……
如果培训公司是想把hadoop这个如此简单的故意搞复杂的话,那么我鄙视你……什么为了方便测试之类的云云,都是扯淡
按照我的理解:你的机器上能运行hello world,就能编写hadoop程序!
Hadoop新人必须先记在心里的东西:
1、cygwin只是模拟了linux环境
2、hadoop必须安装在linux环境上
3、mapreduce程序开发直接就在window上开发即可,你是怎么开发java项目的,就怎么写mapreduce程序
4、mapreduce程序的运行:你是怎么运行java main方法的,那就怎么运行mapreduce程序,可以把写好的程序打成jar包 放到hadoop集群上 执行hadoop命令(就像大家安装完 验证集群是否正常运行那样 ”计算圆周率“一样)
5、我们学的是hadoop 而不是整环境 ,可以先把环境的问题绕过
6、刚开始千万别用eclipse连接hadoop集群,如果你实在是闲着无聊,那请你自己钻研
7、如果你说6的理由是测试方便,那我告诉你,写junit更方便
下面的视频是给想挑战自己能力人看的,如果只是想学好Hadoop的话就别看了!

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。

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

环境准备-Hadoop安装过程

环境准备
1、利用vmware安装centOS6系统
2、Window开启VMware Network Adapter VMnet8
注意:虚拟机网络类型选择NAT;安装操作系统是开启网络默认启动;获取IP为DNS自动获取;虚拟机安装成功后,关闭防火墙;检查虚拟机网络和物理机网络是否能ping通;



虚拟机ping物理主机
3、安装jdk,版本大为1.6,采用sun公司的jdk而不是openjdk
参考:《Linux下安装jdk