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("啓動狀態");

        }

相關文章
相關標籤/搜索