2012年8月12日

基于开源ssh Ganymed 的ssh远程连接工具(共同讨论版)

     摘要: ssh 连接工具实现, ganymed-ssh2 阻塞  阅读全文

posted @ 2012-08-12 18:34 scorpio小蝎 阅读(4966) | 评论 (4)编辑 收藏

2012年7月10日

java 多态产生的疑问

     摘要: java 多态的特例 不是所有方法都可以被覆盖 父类中private方法不支持多态  阅读全文

posted @ 2012-07-10 17:27 scorpio小蝎 阅读(275) | 评论 (7)编辑 收藏

2012年1月2日

Hadoop 集群配置过程及问题总结

转载请注明:
http://www.blogjava.net/roymoro/archive/2012/01/02/367731.html
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(用于masterslave远程登录):sudo apt-get install ssh

1.1.2     安装jdk

       1)解压sun jdk压缩包到指定的文件夹。

              sudo vi /etc/profile 或者 etc nano /etc/profile

  •         配置/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进程模拟分布式中的中的各类节点namenodedatanodejobtrackertasktrackersecondary 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地址;tmphadoop.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的端口。

注意端口的选择一定要恰当,尤其是集群的配置。默认的90009001很容易被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

NameNodeJobTracker

Node2

192.168.234.129

DataNodeTaskTracker

Node3

192.168.234.130

DataNodeTaskTracker

修改每台机器上的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 方式查看

JobTrackerhttp://node1:50030

NameNodehttp://node1:50070

 

 

           

 

1.4          eclipse 插件安装

安装eclipse 只需要把hadoop/contrib/eclipse-plus 下的包考到eclipseplus里即可。(该方法有问题,因为该插件只能部分支持eclipse3.6,如果需要全部支持安装eclipse3.4以下版本,或修改该插件较复杂)。如果有谁修改了适合3.6以上的插件roymoro@gmail.com.帮我发一份。

 

posted @ 2012-01-02 17:41 scorpio小蝎 阅读(7382) | 评论 (2)编辑 收藏

2011年5月9日

Java 实现程序运行状态监控 之我的思路(守护进程)

     摘要:   Java 实现程序运行监控状态之我的思路(守护进程) 问题:写出这个工具的意义在于我运行一个需要长时间执行的程序,如单线程爬虫。在网络出现中断的或网站丢包情况下,程序会抛出socketexception 和sockettimeoutexception。程序会中断。(再此只是提出一种假设) 解决方案: Java 并不能像C#一样对windows的进程进行监控(资料说这是跨平台原...  阅读全文

posted @ 2011-05-09 13:42 scorpio小蝎 阅读(11628) | 评论 (4)编辑 收藏

2011年4月28日

JAVA 正则表达式的溢出问题 及不完全解决方案。 (感谢Lancelot 在评论中给出的方法)

Exception in thread "main" java.lang.StackOverflowError
at java.lang.Character.codePointAt(Character.java:
2335)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:
3344)
at java.util.regex.Pattern$Branch.match(Pattern.java:
4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:
4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:
4357)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:
4227)
 at java.util.regex.Pattern$BranchConn.match(Pattern.java:
4078)
类似于以上异常,源自于正则匹配需要不断地递归字符串。当字符串递归超过800+,具体数字忘记了,就会出现堆栈溢出。
 我在实际应用的场景是,匹配一个网页寻求《div》《/div》 之间的内容。当div 之间字符达到了950的时候这时候产生了 类似以上的错误。
经过分析,和网友遇到的类似问题贴http://topic.csdn.net/u/20110303/10/6a7dce52-481b-430a-b442-98099e9a01c9.html
得出以下不完全正确的解析方案

在正则表达式匹配时对字符个数进行限制 如:"<div>(.*?|\n*|\r*)*</div> 变成了 <div>(.*?|\n*|\r*){0,700}</div> 这样达到了限制字符的作用。
但是当解析到此条目时速度仍然非常慢。

如果您有更好的解决方案请您联系我。

欢迎转帖。转帖请标注出处,以更好的和大家探讨解决问题。

——————————————————————————————————————
Lancelot 提出的正则<div[^>]*>([\s\S]*?)</div>  或<div>([\s\S]*?)</div>
由于没有分支条件,因此大大减少了正则匹配过程的回溯深度。因此成功解决了这一问题。
目前能和大家分享的是,如果遇到类似问题还需简化正则,减少分支条件等。
如果您有更好的方案欢迎您提出宝贵的建议。

posted @ 2011-04-28 10:55 scorpio小蝎 阅读(4477) | 评论 (12)编辑 收藏

2011年3月2日

java 枚举学习--从小程序中学习

 

Java 枚举类型 解析

简介:java中枚举是一个类

用之前我觉得还是要知道应该何时使用:

一条普遍的规律是,任何使用常量的地方,例如目前使用的switch 代码切换的地方。 如果只是单独一个值(例如, max min)这类只要把任务留给常量就行。但是如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。

Java 代码

  1. public enum Color{   
  2.     RED,BLUE,BLACK,YELLOW,GREEN   
  3. }  

从这里看到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语句中使用

  1. Color color=Color.RED;   
  2. switch(color){   
  3.         case RED: System.out.println("it's red");break;   
  4.         case BLUE: System.out.println("it's blue");break;   
  5.         case BLACK: System.out.println("it's blue");break;   
  6. }  

-----------------------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);

           }

       }

}

posted @ 2011-03-02 20:32 scorpio小蝎 阅读(1952) | 评论 (0)编辑 收藏

2011年2月24日

正则表达式三十分钟入门(本文转自http://deerchao.net/tutorials/regex/regex.htm)感谢作者 deerchao

     摘要:   正则表达式学习笔记 首先推荐一篇入门文章:http://deerchao.net/tutorials/regex/regex.htm#mission 感谢作者 下面先对本文章做一下笔记: 1、 正则表达式是什么:处理字符串的有效工具。 2、 从例子开始学习正则: ...  阅读全文

posted @ 2011-02-24 14:49 scorpio小蝎 阅读(692) | 评论 (0)编辑 收藏

2011年2月21日

实现简单的 hosts 添加和删除工具

     摘要: C# hosts 修改  阅读全文

posted @ 2011-02-21 00:01 scorpio小蝎 阅读(941) | 评论 (0)编辑 收藏

仅列出标题  
<2020年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿

随笔分类

随笔档案

友情链接

搜索

最新评论

阅读排行榜

评论排行榜