尘世随缘
作者尘世随缘·2015-08-19 14:59
技术总监·上海某互联网金融公司

java 程序员你真的懂java吗?一起来看下hadoop中的如何去使用java的

字数 3641阅读 2167评论 0赞 2

大数据是目前IT技术中最火热的话题,也是未来的行业方向,越来越多的人参与到大数据的学习行列中。从最基础的伪分布式环境搭建,再到分布式环境搭建,再进入代码的编写工作。这时候码农和大牛的分界点已经出现了,所谓的码农就是你让我做什么我就做什么,我只负责实现,不管原理,也不想知道原理。大牛就开始不听的问自己why?why?why?于是乎,很自然的去看源码了。然而像hadoop这样的源码N多人参与了修改和完善,看起来非常的吃力。然后不管如何大牛就是大牛,再硬的骨头也要啃。目前做大数据的80%都是从WEB开发转变过来的,什么spring mvc框架、SSH框架非常熟悉,其实不管你做了多少年的WEB开发,你很少接触到hadoop中java代码编写的风格,有些人根本就看不懂什么意思。下面我来介绍下hadoop源码怎么看。

hadoop体现的是分布式框架,因此所有的通信都基于RPC来操作,关于RPC的操作后续再介绍。hadoop源码怎么看系列分多个阶段介绍,下面重点介绍下JAVA基础知识。

一、多线程编程

在hadoop源码中,我们能看到大量的类似这样的代码

 return executor.submit(new Callable<String>() {

      @Override

      public String call() throws Exception {

       //方法类

      }

 下面简单介绍下java的多线程编程

 启动一个线程可以使用下列几种方式

1、创建一个Runnable,来调度, 返回结果为空。

ExecutorService executor = Executors.newFixedThreadPool(5);

     executor.submit(new Runnable() {

@Override

     public void run() {

          System.out.println("runnable1 running.");

     }

  });

这种方式启动一个线程后,在后台运行,不用等到结果,因为也不会返回结果

2、创建一个Callable,来调度,有返回结果

Future<String> future1 = executor.submit(new Callable<String>() {

    @Override

    public String call() throws Exception {

        // TODO Auto-generated method stub 

//具体执行一些内部操作

      return "返回结果了!";

 }

 });

System.out.println("task1: " + future1.get());

这种启动方式一直等到call的方法体执行完毕后,并返回结果了才继续执行下面的代码

二、内部类实现

hadoop中同样能看到大量这样形式的代码

 status = ugi.doAs(new PrivilegedExceptionAction<JobStatus>() {

      public JobStatus run() throws IOException, InterruptedException, 

      ClassNotFoundException {

        return submitter.submitJobInternal(Job.this, cluster);

      }

    });

这是一个典型的内部类实现,PrivilegedExceptionAction是一个接口,里面有一个run方法需要实现,程序调用的时候,会执行里面的submitter.submitJobInternal方法体

为了方便大家理解,我写了一个模拟程序来演示

先定义一个接口类

public interface TransactionAction {

void execute() throws Exception;  

}

再定义一些模板方法,参数对象是一个接口来处理相关业务

public  class TemplateAction {

public void transactionProcess(TransactionAction action, ActionEvent event){ 

        System.out.println("lock");

try {

action.execute();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("unlock");

}

}

调用过程

public void doSome(){

TemplateAction t=new TemplateAction();

//public void transactionProcess(TransactionAction action, ActionEvent event) 

event2 =new ActionEvent ();

event2.setMsg("内部类");

final DoAction doaction=new DoAction();

t.transactionProcess(new TransactionAction() {

@Override

public void execute() throws Exception {

// TODO Auto-generated method stub

doaction.sayWhatEvent(event2);

}  

 }, new ActionEvent());

}

运行结果如下:

lock

say:内部类

unlock

上面的内部类执行过程很明确,到底execute何时执行不是由dosome来设定,而是由TemplateAction中的transactionProcess来确定

三、枚举类型

枚举类型比较容易理解,例如在我们习惯定义一些常量, 

static int ACTION_TYPE=0; //0表示初始,1表示启动,2表示运行中 3表示停止

程序中我们这样判断

if(ACTION_TYPE==1){

  doSomeThing()

}

例如:

// TODO Auto-generated method stub

JobState state = JobState.DEFINE;

        if(state==JobState.RUNNING){

        System.out.println("运行状态");

        }else{

        System.out.println("初始状态");

        }

        

        if(jobType==0){

        System.out.println("初始状态");

        }else if(jobType==1){

        System.out.println("启动状态");

        }

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广