java 基础知识之hadoop源码阅读必备

java 程序员你真的懂java吗?

一块儿来看下hadoop中的如何去使用java的

 

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

hadoop体现的是分布式框架,所以全部的通讯都基于RPC来操做,关于RPC的操做后续再介绍。hadoop源码怎么看系列分多个阶段介绍,下面重点介绍下JAVA基础知识。程序员

1、多线程编程spring

在hadoop源码中,咱们能看到大量的相似这样的代码编程

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

      @Overridemvc

      public String call() throws Exception {框架

       //方法类分布式

      }ide

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

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

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

ExecutorService executor = Executors.newFixedThreadPool(5);

     executor.submit(new Runnable() {

        @Override

     public void run() {

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

     }

  });

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

二、建立一个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的方法体执行完毕后,并返回结果了才继续执行下面的代码

2、内部类实现

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来肯定

 

3、枚举类型

 

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

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("启动状态");

        }

相关文章
相关标签/搜索