大數據是目前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("啓動狀態");
}