稍微研究了一下HdfsProxy,希望可以瞭解其機制,簡單的實現一個server端
首先看一下其開始的流程圖:
在main函數中首先調用了HdfsProxy的createHdfsProxy,在這個函數中new了一個Configuration,然後加載了hdfsproxy-default.xml文件,該文件中有一些基本的配置,需要用戶添加,具體用到了什麼後邊可以看到。
StringUtils.startupShutdownMessage函數主要是用來打開關閉一個LOG的,這裏可以不用過多的在意,主要是一個追蹤過程
然後new了一個HdfsProxy對象,在構造函數中完成了初始化操作,在這個函數中第一句話就是:
sslAddr = getSslAddr(conf);
從conf中獲得sslAddr
然後是:
String nn = conf.get("hdfsproxy.dfs.namenode.address");
說明在上述提到的xml文件中需要配置namenode的地址
之後根據這個字符串創建了InetSocketAddress,並且new了一個新的configuration,該configuration主要是加載ssl相關的一些配置
然後new了一個ProxyHttpServer對象,傳遞的參數就是剛創建的sslConf以及從conf中得到的sslAddr
之後就是給這個proxyServer設置一些屬性,包括proxy的端口,連接的namenode的地址,當前的conf
然後調用了proxy的addGlobalFilter函數,這個過程主要涉及到hadoop的一些身份認證的過程,暫時不去了解分析,就先放下了
接下來的三句話很關鍵,在這個proxy中添加註冊了不同的servlet,指明瞭不同的https url的前綴處理的函數不同。
之後就是調用了start函數,開啓了server
接下來看一下類圖,瞭解各類之間的關係
HdfsProxy本身並沒有做什麼事情,它還是使用Hadoop本身的HttpServer,就是增加了一層封裝,並且只實現了doGet方法,屬於非常簡單的server
現在23.1版本的代碼不再是使用HdfsProxy,而是一個新的包httpfs,關於這個初步猜測可能是hoop的contribute。暫時沒有去分析,以後有機會再說吧 呵呵