转载请注明:
Hadoop 实践入门
1 实验环境搭建
1.1 准备工作
ubuntu/redhat
JDK/openjdk
Hadoop
Eclipse
vmvare/virtureBox
1.1.1 ubuntu 安装
下载最新版本ubuntu 11.10。
安装注意事项:
1、关闭防火墙:shell命令 sudo ufw disable。不关闭有可能造成master slave 通信失败。出现连接超时,重连错误。可以通过指定iptables 实现端口过滤。
2、安装ssh(用于master和slave远程登录):sudo apt-get install ssh
1.1.2 安装jdk
1)解压sun jdk压缩包到指定的文件夹。
sudo vi /etc/profile 或者 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
2)可以使用openjdk sudo apt-get insall open-jdk-6 或者通过软件中心。
验证 shell命令 :java -version 看是否与你的版本号一致
1.1.3 安装hadoop
在每台机器上相同用户的home根目录下解压,hadoop-0.20.2.tar.gz 配置conf/hadoop-env.sh文件。 增加 export JAVA_HOME =/usr/lib/jvm/java-6-openjdk 这里修改为你的jdk的安装位置。
1.2 伪分布式搭建
Hadoop可以在单电商以为分布分布式模式运行,用不同的java进程模拟分布式中的中的各类节点namenode,datanode,jobtracker,tasktracker,secondary namenode
1.2.1 hadoop配置
hadoop 0.2.0.2之后需要修改core-site.xml\hdfs-site.xml 以及 mapred-site.xml
配置文件如下:
core-site.xml 配置核心内容,其中fs.default.name 为hdfs地址;tmp为hadoop.tnp.dir为临时文件
<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>
注意事项:一定要指定,相同的用户名,并且tmp一定要设置,否则会出现权限问题。导致hadoop启动失败。也可以通过chmod 命令来改变默认tmp的权限。默认tmp路径为:/usr/tmp。推荐第一种方式。
hdfs-site.xml 设置 hdfs 参数
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
这里dfs.replication指块的副本数。副本数具体策略可参加见hadoop官方指南。
mapred-site.xml 文件的修改
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:49001</value>
</property>
</configuration>
这个设置了jobtracker的端口。
注意端口的选择一定要恰当,尤其是集群的配置。默认的9000和9001很容易被ubuntu中其他进程占用,导致datanode失效,因此选择没有占用的49000 和49001。笔者,曾经就曾困扰与此。集群配置中将再次强调。
1.2.2 ssh设置
因为master需要访问datanode因此需要免密码ssh
设置方法:
ssh-keygen -t rsa然后一直按回车
完成后,在home跟目录下会产生隐藏文件夹.ssh
cd .ssh
之后ls 查看文件
cp id_rsa.pub authorized_keys
测试:
ssh localhost发现链接成功,并且无需密码。
1.2.3 hadoop运行
在hadoop安装目录下:
首先 bin/hadoop namenode -format格式化文件系统
然后 bin/start-all.sh 来启动守护进程。
利用java 命令 jps 查看进程。或者通过 网址:localhost:50070 localhost:50030来查看是否成功。
1.3 集群搭建
如上所述安装ubuntu 并且拥有相同用户。安装jdk ,安装hadoop。配置jdk路径等。
1.3.1 主机信息:
机器名 |
IP地址 |
作用 |
Node1 |
192.168.234.128 |
NameNode、JobTracker |
Node2 |
192.168.234.129 |
DataNode、TaskTracker |
Node3 |
192.168.234.130 |
DataNode、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 设置
把NameNode 上的id_dsa.pub 文件追加到DataNode 的authorized_keys 内:
a. 拷贝NameNode 的id_dsa.pub 文件:
$ scp id_dsa.pub hadooper@node2:/home/hadoop/
b. 登录node2,执行
$ cat id_dsa.pub >> .ssh/authorized_keys
在所有datanode上执行相同的操作。
验证:从node1
ssh node2
exit
ssh node3
exit
如果全部免密码登录则成功
1.3.3 配置hadoop
配置conf/masters 和conf/slaves 文件
Masters
node1
Slaves
node2
node3
core-site mapred-site 和hdfs-site 和伪分布配置基本相同.只是对应地址,localhost换成了namenode的名称,node1。
q 配置conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node1:49000</value>
</property>
</configuration>
仍然注意端口,在运行时如果datanode连接不上namenode,有可能是由于端口问题。换一个端口
1.3.4 运行hadoop
首先格式化文件系统:$ bin/hadoop namenode –format
启动Hadoop集群:
$ bin/start-all.sh
停止Hadoop集群:
$ bin/stop-all.sh
查看集群状态:$ bin/hadoop dfsadmin -report
Hadoop 的web 方式查看
JobTracker:http://node1:50030
NameNode:http://node1:50070
1.4 eclipse 插件安装
安装eclipse 只需要把hadoop/contrib/eclipse-plus 下的包考到eclipse的plus里即可。(该方法有问题,因为该插件只能部分支持eclipse3.6,如果需要全部支持安装eclipse3.4以下版本,或修改该插件较复杂)。如果有谁修改了适合3.6以上的插件roymoro@gmail.com.帮我发一份。
Java 枚举类型 解析
简介:java中枚举是一个类
用之前我觉得还是要知道应该何时使用:
一条普遍的规律是,任何使用常量的地方,例如目前使用的switch 代码切换的地方。 如果只是单独一个值(例如, max 和min)这类只要把任务留给常量就行。但是如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。
Java 代码
- public enum Color{
- RED,BLUE,BLACK,YELLOW,GREEN
- }
从这里看到Enum 是一个类。 而这些类都是类库中enum的子类。
Java中已有的enum 是Color 枚举类。Color c=Color.RED;这些都是public static final 的
既然枚举类是class,当然在枚举类中有构造器,方法和数据域。但是它是特殊的构造函数。(不深入研究,只应用)
枚举中常见的方法:
Ordinal();返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
Color.RED.ordinal(); //返回结果:0
Color.BLUE.ordinal(); //返回结果:1
compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
Color.RED.compareTo(Color.BLUE); //返回结果 -1
values()方法: 静态方法,返回一个包含全部枚举值的数组。
Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+",");
}//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
toString()方法: 返回枚举常量的名称。
Color c=Color.RED;
System.out.println(c);//返回结果: RED
valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
Color.valueOf("BLUE"); //返回结果: Color.BLUE
equals()方法: 比较两个枚举类对象的引用。
枚举类的具体应用
枚举类可以在switch语句中使用
- Color color=Color.RED;
- switch(color){
- case RED: System.out.println("it's red");break;
- case BLUE: System.out.println("it's blue");break;
- case BLACK: System.out.println("it's blue");break;
- }
-----------------------java枚举学习心得从小程序出发 ---------------------------
基本的enum特性
publicclass Test {
/**
* @param args
*/
enum Shrubbery {
GROUND, GRAWLING, HANGING
}
/**
* 枚举类的基础知识
*/
publicstatic void bKOfEmun(){
for (Shrubbery s : Shrubbery.values()) {
// ordinal() 返回枚举中的位置如GROUND 在0 位置
System.out.println(s + "ordinal" + s.ordinal());// 名称+位置信息
// compareto比较枚举类型按照 ordinal的值比较-1 0 1
System.out.print(s.compareTo(Shrubbery.GRAWLING) + " ");
// equals 和== 看枚举值是否相同
System.out.print(s.equals(Shrubbery.GRAWLING) + " ");
System.out.println(s == Shrubbery.GRAWLING);
// 返回枚举所在的类的名称。
System.out.println(s.getDeclaringClass());
// name()相当于tostring()返回枚举的值
System.out.println(s.name());
System.out.println("-----------------------");
}
for (String s : "HANGING GRAWLING GROUND".split(" ")) {
// valueof 返回枚举类中名称为 s的枚举对象
Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
System.out.println(shrub);
}
for (Shrubbery s : Shrubbery.values()) {
// ordinal() 返回枚举中的位置如GROUND 在0 位置
System.out.println(s + "ordinal" + s.ordinal());// 名称+位置信息
// compareto比较枚举类型按照 ordinal的值比较-1 0 1
System.out.print(s.compareTo(Shrubbery.GRAWLING) + " ");
// equals 和== 看枚举值是否相同
System.out.print(s.equals(Shrubbery.GRAWLING) + " ");
System.out.println(s == Shrubbery.GRAWLING);
// 返回枚举所在的类的名称。
System.out.println(s.getDeclaringClass());
// name()相当于tostring()返回枚举的值
System.out.println(s.name());
System.out.println("-----------------------");
}
for (String s : "HANGING GRAWLING GROUND".split(" ")) {
// valueof 返回枚举类中名称为 s的枚举对象
Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
System.out.println(shrub);
}
}
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
bKOfEmun();//枚举类的基础知识
}
}
枚举中填入方法
一般说来我们希望每个枚举实例能够返回对自身的描述,而不仅仅是默认toString()实现,这只能返回枚举实例的名字。为此我们可以提供一个构造器,专门负责处理这个额外的信息,然后添加一个方法,返回这个描述信息。
构造过程如下 :
首先 建立枚举
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) {//注意只能为 private 这里与正常类的构造函数有区别
this.description=description;
}
public String getDescription() {
returndescription;
}
publicstaticvoid main(String[] args) {
for(OzWitch o:OzWitch.values()){
System.out.println(o.name()+":"+o.getDescription());
}
}
}
覆盖enum方法:此程序目的在于把枚举对象的首字母保留大写,其余小写
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);
}
}
}