??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
Hadoop 实践入门
http://www.aygfsteel.com/roymoro/archive/2012/01/02/367731.html
1 实验环境搭徏
1.1 准备工作
ubuntu/redhat
JDK/openjdk
Hadoop
Eclipse
vmvare/virtureBox
1.1.1 ubuntu 安装
下蝲最新版?/span>ubuntu 11.10?/span>
安装注意事项Q?/span>
1、关闭防火墙Q?/span>shell命o sudo ufw disable。不关闭有可能造成master slave 通信p|。出现连接超Ӟ重连错误。可以通过指定iptables 实现端口qo?/span>
2、安?/span>sshQ用?/span>master?/span>slaveq程dQ:sudo apt-get install ssh
1.1.2 安装jdk
1Q解?/span>sun jdk压羃包到指定的文件夹?/span>
sudo vi /etc/profile 或?/span> etc nano /etc/profile
export JAVA_HOME=/usr/java/jdk1.6.0_22
export JRE_HOME=/usr/java/jdk1.6.0_22/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
2Q可以?/span>openjdk sudo apt-get insall open-jdk-6 或者通过软g中心?/span>
验证 shell命o Q?/span>java -version 看是否与你的版本号一?/span>
1.1.3 安装hadoop
在每台机器上相同用户?/span>home根目录下解压Q?/span>hadoop-0.20.2.tar.gz 配置conf/hadoop-env.sh文g?/span> 增加 export JAVA_HOME =/usr/lib/jvm/java-6-openjdk q里修改Z?/span>jdk的安装位|?/span>
1.2 伪分布式搭徏
Hadoop可以在单电商以ؓ分布分布式模式运行,用不同的javaq程模拟分布式中的中的各c节?/span>namenodeQ?/span>datanodeQ?/span>jobtrackerQ?/span>tasktrackerQ?/span>secondary namenode
1.2.1 hadoop配置
hadoop 0.2.0.2之后需要修?/span>core-site.xml\hdfs-site.xml 以及 mapred-site.xml
配置文g如下Q?/span>
core-site.xml 配置核心内容Q其?/span>fs.default.name ?/span>hdfs地址Q?/span>tmp?/span>hadoop.tnp.dirZ时文?/span>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:49000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadooper/hadooptmp</value>
</property>
</configuration>
注意事项Q一定要指定Q相同的用户名,q且tmp一定要讄Q否则会出现权限问题。导?/span>hadoop启动p|。也可以通过chmod 命o来改变默?/span>tmp的权限。默?/span>tmp路径为:/usr/tmp。推荐第一U方式?/span>
hdfs-site.xml 讄 hdfs 参数
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
q里dfs.replication指块的副本数。副本数具体{略可参加见hadoop官方指南?/span>
mapred-site.xml 文g的修?/span>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:49001</value>
</property>
</configuration>
q个讄?/span>jobtracker的端口?/span>
注意端口的选择一定要恰当Q尤其是集群的配|。默认的9000?/span>9001很容易被ubuntu中其他进E占用,Ddatanode失效Q因此选择没有占用?/span>49000 ?/span>49001。笔者,曄曾困扰与此。集配|中再ơ强调?/span>
1.2.2 ssh讄
因ؓmaster需要访?/span>datanode因此需要免密码ssh
讄ҎQ?/span>
ssh-keygen -t rsa然后一直按回R
完成后,?/span>home跟目录下会生隐藏文件夹.ssh
cd .ssh
之后ls 查看文g
cp id_rsa.pub authorized_keys
试Q?/span>
ssh localhost发现链接成功Qƈ且无需密码?/span>
1.2.3 hadoopq行
?/span>hadoop安装目录下:
首先 bin/hadoop namenode -format格式化文件系l?/span>
然后 bin/start-all.sh 来启动守护进E?/span>
利用java 命o jps 查看q程。或者通过 |址Q?/span>localhost:50070 localhost:50030来查看是否成功?/span>
1.3 集群搭徏
如上所q安?/span>ubuntu q且拥有相同用户。安?/span>jdk Q安?/span>hadoop。配|?/span>jdk路径{?/span>
1.3.1 L信息Q?/span>
机器?/span> |
IP地址 |
作用 |
Node1 |
192.168.234.128 |
NameNode?/span>JobTracker |
Node2 |
192.168.234.129 |
DataNode?/span>TaskTracker |
Node3 |
192.168.234.130 |
DataNode?/span>TaskTracker |
修改每台机器上的hosts
sudo vi /etc/hosts
192.168.1.31 node1
192.168.1.32 node2
192.168.1.33 node3
1.3.2 ssh 讄
?/span>NameNode 上的id_dsa.pub 文gq加?/span>DataNode ?/span>authorized_keys 内:
a. 拯NameNode ?/span>id_dsa.pub 文gQ?/span>
$ scp id_dsa.pub hadooper@node2:/home/hadoop/
b. dnode2Q执?/span>
$ cat id_dsa.pub >> .ssh/authorized_keys
在所?/span>datanode上执行相同的操作?/span>
验证Q从node1
ssh node2
exit
ssh node3
exit
如果全部免密码登录则成功
1.3.3 配置hadoop
配置conf/masters ?/span>conf/slaves 文g
Masters
node1
Slaves
node2
node3
core-site mapred-site ?/span>hdfs-site 和伪分布配置基本相同.只是对应地址Q?/span>localhost换成?/span>namenode的名Uͼnode1?/span>
q 配置conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node1:49000</value>
</property>
</configuration>
仍然注意端口Q在q行时如?/span>datanodeq接不上namenodeQ有可能是由于端口问题。换一个端?/span>
1.3.4 q行hadoop
首先格式化文件系l:$ bin/hadoop namenode –format
启动Hadoop集群Q?/span>
$ bin/start-all.sh
停止Hadoop集群Q?/span>
$ bin/stop-all.sh
查看集群状态:$ bin/hadoop dfsadmin -report
Hadoop ?/span>web 方式查看
JobTrackerQ?/span>http://node1:50030
NameNodeQ?/span>http://node1:50070
1.4 eclipse 插g安装
安装eclipse 只需要把hadoop/contrib/eclipse-plus 下的包考到eclipse?/span>plus里即可?/span>(该方法有问题Q因插g只能部分支持eclipse3.6Q如果需要全部支持安?/span>eclipse3.4以下版本Q或修改该插件较复杂)。如果有谁修改了适合3.6以上的插?/span>roymoro@gmail.com.帮我发一份?/span>
介:java中枚举是一个类
用之前我觉得q是要知道应该何时用:
一条普遍的规律是,M使用帔R的地方,例如目前使用?/span>switch 代码切换的地斏V?/span> 如果只是单独一个|例如Q?/span> max ?/span>minQ这cd要把d留给帔Rp。但是如果定义了一l|而这些g的Q何一个都可以用于特定的数据类型,那么枚丄在这个地Ҏ适合不过?/span>
Java 代码
从这里看?/span>Enum 是一个类?/span> 而这些类都是cd?/span>enum的子cR?/span>
Java中已有的enum ?/span>Color 枚DcR?/span>Color c=Color.RED;q些都是public static final ?/span>
既然枚DcLclassQ当然在枚DcM有构造器Q方法和数据域。但是它是特D的构造函数。(不深入研IӞ只应用)
枚D中常见的ҎQ?/span>
OrdinalQ)Q?/span>q回枚D值在枚Dcȝ的顺序。这个顺序根据枚丑ր声明的序而定?br />
Color.RED.ordinal(); //q回l果Q?
Color.BLUE.ordinal(); //q回l果Q?
compareTo()Ҏ: Enum实现了java.lang.Comparable接口Q因此可以比较象与指定对象的序。Enum中的compareToq回的是两个枚D值的序之差。当Ӟ前提是两个枚丑ր必d于同一个枚丄Q否则会抛出ClassCastException()异常?具体可见源代?
Color.RED.compareTo(Color.BLUE); //q回l果 -1
values()ҎQ?静态方法,q回一个包含全部枚丑ր的数组?br />
Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+",");
}//q回l果QRED,BLUE,BLACK YELLOW,GREEN,
toString()ҎQ?q回枚D帔R的名U?br />
Color c=Color.RED;
System.out.println(c);//q回l果: RED
valueOf()ҎQ?q个Ҏ和toStringҎ是相对应的,q回带指定名U的指定枚Dcd的枚丑ָ量?br />
Color.valueOf("BLUE"); //q回l果: Color.BLUE
equals()ҎQ?比较两个枚Dcd象的引用?/span>
枚Dcȝ具体应用
枚Dcd以在switch语句中?/span>
-----------------------java枚D学习心得从小E序出发 ---------------------------
基本?/span>enumҎ?/span>
publicclass Test {
/**
* @param args
*/
enum Shrubbery {
GROUND, GRAWLING, HANGING
}
/**
* 枚Dcȝ基础知识
*/
publicstatic void bKOfEmun(){
for (Shrubbery s : Shrubbery.values()) {
// ordinal() q回枚D中的位置?/span>GROUND ?/span>0 位置
System.out.println(s + "ordinal" + s.ordinal());// 名称+位置信息
// compareto比较枚Dcd按照 ordinal的值比?/span>-1 0 1
System.out.print(s.compareTo(Shrubbery.GRAWLING) + " ");
// equals ?/span>== 看枚丑ր是否相?/span>
System.out.print(s.equals(Shrubbery.GRAWLING) + " ");
System.out.println(s == Shrubbery.GRAWLING);
// q回枚D所在的cȝ名称?/span>
System.out.println(s.getDeclaringClass());
// name()相当?/span>tostring()q回枚D的?/span>
System.out.println(s.name());
System.out.println("-----------------------");
}
for (String s : "HANGING GRAWLING GROUND".split(" ")) {
// valueof q回枚DcM名称?/span> s?/span>枚D对象
Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
System.out.println(shrub);
}
for (Shrubbery s : Shrubbery.values()) {
// ordinal() q回枚D中的位置?/span>GROUND ?/span>0 位置
System.out.println(s + "ordinal" + s.ordinal());// 名称+位置信息
// compareto比较枚Dcd按照 ordinal的值比?/span>-1 0 1
System.out.print(s.compareTo(Shrubbery.GRAWLING) + " ");
// equals ?/span>== 看枚丑ր是否相?/span>
System.out.print(s.equals(Shrubbery.GRAWLING) + " ");
System.out.println(s == Shrubbery.GRAWLING);
// q回枚D所在的cȝ名称?/span>
System.out.println(s.getDeclaringClass());
// name()相当?/span>tostring()q回枚D的?/span>
System.out.println(s.name());
System.out.println("-----------------------");
}
for (String s : "HANGING GRAWLING GROUND".split(" ")) {
// valueof q回枚DcM名称?/span> s?/span>枚D对象
Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
System.out.println(shrub);
}
}
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
bKOfEmun();//枚Dcȝ基础知识
}
}
枚D中填入方?/span>
一般说来我们希望每个枚丑֮例能够返回对自n的描qͼ而不仅仅是默?/span>toString()实现Q这只能q回枚D实例的名字。ؓ此我们可以提供一个构造器Q专门负责处理这个额外的信息Q然后添加一个方法,q回q个描述信息?/span>
构造过E如?/span> Q?/span>
首先 建立枚D
publicenum OzWitch {
WEST,NORTH,EAST,SOUTH
}
然后创徏描述信息
publicenum OzWitch {
WEST,NORTH,EAST,SOUTH;//注意分号
private String description;//描述信息
public String getDescription() {
returndescription;
}
publicstaticvoid main(String[] args) {
}
}
创徏构造器
publicenum OzWitch {
WEST("1111"),NORTH("2222"),EAST("3333"),SOUTH("4444");//注意分号
private String description;//描述信息
OzWitch(String description) {//注意只能?/span> private q里与正常类的构造函数有区别
this.description=description;
}
public String getDescription() {
returndescription;
}
publicstaticvoid main(String[] args) {
for(OzWitch o:OzWitch.values()){
System.out.println(o.name()+":"+o.getDescription());
}
}
}
覆盖enumҎQ此E序目的在于把枚丑֯象的首字母保留大写,其余写
publicenum SpaceShip {
SCOUT,CARGO,TRANSPORT,CRUISER,BATTLESHIP,MOTHERSHIP;
@Override
public String toString() {
// TODO Auto-generated method stub
String id=name();
String lower=name().substring(1).toLowerCase();
return id.charAt(0)+lower;
}
publicstaticvoid main(String[] args) {
for(SpaceShip s:SpaceShip.values()){
System.out.println(s);
}
}
}