想要裝 v8-profiler 但是裡面都是 c++ 的 src code 跟 js ,npm 上面的版本又不對…,裡面包含一個 wscript 不曉得怎麼編譯,
node-waf configure build && node test.js
如果 node 路徑 not fount 可以先下 export NODE_PATH=/root/node-v0.2.6 之類的…
參考資源:
想要裝 v8-profiler 但是裡面都是 c++ 的 src code 跟 js ,npm 上面的版本又不對…,裡面包含一個 wscript 不曉得怎麼編譯,
node-waf configure build && node test.js
如果 node 路徑 not fount 可以先下 export NODE_PATH=/root/node-v0.2.6 之類的…
參考資源:
紀錄一下…想要建一個真實跟虛擬的主機都能連線的環境,且沒用很多IP,由於 IP 有限,要架設很多台的環境需要設定一下網路,所以要建立一個虛擬的區域網路,由一台 Master 負責 DHCP 與 NAT ,幫 Master 建立兩個虛擬網卡,與按下圖 2 處建立第二個 vSwitch,將 Node 與 Master 接在同個虛擬網路,然後 Master 第二個網卡對應到有真實網卡的虛擬網路,然後外部的 Node 們透過 VPN 與虛擬區網內的 Node 連線。
架設 pptpd[4] 伺服器,接著測試用 windows vpn 連入,linux 圖形化介面設定方式也類似,指令則比較麻煩…[5]
整理一下設定 pppd client 命令列的步驟:
網路設定:
在這邊要注意 iptables 的設定跟 route 的設定, iptables 大都照著鳥哥[3]的設定就可以使用了,但是在 route 的地方處理的是封包要往哪走,如果是透過 ppp 連上虛擬區網的主機,就要設定一下將虛擬網路的封包都導向 ppp0 中,
route add -net 192.168.1.0 netmask 255.255.255.0 dev ppp0
route 增加 -net 網段 netmask 遮罩 dev 網路介面
在這邊就是指 192.168.1.0-254 的封包都要往 ppp0 (vpn) 送,才能連到虛擬網路,否則會走原本的實體IP就連不到東西了。
參考資源:
環境:hadoop-0.20.2
當透過 HDFS Thrift 用 PHP/Python 寫檔案再讀二進制檔案時,會無法順利開啟讀出的檔案。
似乎是因為 Thrift 有支援一種 Binrary 的型態但是 hdfs 的 read/write[1] 都是用 String 的型態所造成的,
名詞解釋
hadoop : 分散式檔案系統與 MapReduce 運算軟體框架
HDFS : 分散式檔案系統
ant : Java 自動編譯工具
thrift : 跨語言 API 介面,由 Facebook 開發用來銜接各語言 api 。
編譯 hadoop 建立 thrift server
$ install ant $ cd ./hdfs ; $ ant compile
if error
[ivy:resolve] module not found: org.apache.hadoop#hadoop-common;0.21.0
原先的 repo snapshot 檔名都換過了,將 build.xml 內 repo 網址改成
https://repository.apache.org/content/repositories/snapshots/ => https://repository.apache.org/service/local/repositories/orgapachehadoop-042/content/
從 https://repository.apache.org/index.html 找到的
編譯 again
warning ‘includeantruntime’ was not set
錯誤 依照錯誤行數 在 javac 加上 includeantruntime=”false” 屬性就略過了 (http://www.coderanch.com/t/503097/tools/warning-includeantruntime-was-not-set)
接著會有 lib not fount 的錯誤
搬移 $hadoop/lib to hdfs/lib 應該是因為 抓的是 release 不是 dev 的版本 目錄位置有些差異,
然後發現缺了 conf ,所以對著 $hadoop/common 造著編譯一次,
然後混和兩個資料夾,我是建了一個 $hadoop/build
然後 cp $hadoop/common $hadoop/build -r ; cp $hadoop/hdfs $hadoop/build -ru
hdfs thrift server 環境就差不多了,thrift 負責建立一個 socket ,然後用各種語言透過 socket 連接 API 。
為什麼要自己編譯 hadoop 呢?我也不知道…感覺可以把編譯好的 hadoop-thrift.jar 拿來用,但是沒有地方有教…
只好照著有人有教的方式做,就編譯吧,順便瞭解一下原始碼路徑,大略看一下程式邏輯,並且之後還能做修改。
編譯 thrift-php ext
接著要建立 php 連接 thrift 的環境,可以先裝 thrift (http://thrift.apache.org/) 只是用不到= =,
thrift 應該是用來把寫好的 *.thrift(抽象API描述) 編譯成各種語言適用的API,只是 hadoop 已經都編譯好了,在 gen-php 裡面,
thrift 下載好以後,裡面有附 php-ext module 的程式,就一樣phpize;./configure;make ;make install;
他好像會在 /usr/lib/php/ 下面複製好對應的程式,./protocol/ , ./transport/ , ./Thrift.php …應該是吧 如果沒有就自己從 Thrift 原始碼裡面 co 出來吧,
然後建立一個 /usr/lib/php/packages/ 然後把 gen-php 丟進去 改名字叫…XD…原始碼裡面有寫…自己看…
example
進資料夾跑 build/src/contrib/thriftfs/scripts/start_thrift_serve.sh $port & 吧 ,可以指定 port,他會連結哪台伺服器一樣在 conf/core-site.xml 裡面設定,
然後在跑 client demo ..應該還ok,只是不知道 thrift_protocol 有作用嗎…
<?php //include thrift路徑 $GLOBALS['THRIFT_ROOT'] = '/usr/lib/php'; require_once( $GLOBALS['THRIFT_ROOT'].'/Thrift.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/packages/hadoopfs/ThriftHadoopFileSystem.php' ); //建立連線 $socket = new TSocket( 'localhost', 50000 ); $socket->setSendTimeout( 10000 ); // Ten seconds $socket->setRecvTimeout( 20000 ); // Twenty seconds $transport = new TBufferedTransport( $socket ); $protocol = new TBinaryProtocol( $transport ); $client = new ThriftHadoopFileSystemClient( $protocol ); //啟動 $transport->open(); /*程式碼寫在這*/ try { $pathname = new Pathname(array("pathname" => "/mlwmlw/")); print_r($client->mkdirs($pathname)); <div>$pathname = new Pathname(array("pathname" => "/")); <div>//列表 print_r($client->listStatus($pathname)); //用帳號名稱相同就能跨伺服器存取資料 權限很弱喔?! } catch(Exception $e) { print_r($e); } $transport->close(); ?>
接著測 create and write 的部份就出錯了,錯誤訊息有兩種,第一次都是
TException: TSocket: Could not write 4 bytes
接著都是 TScoket timeout,在某篇資源裡面有提到他猜測是 php 處理 64bit 的整數時造成的錯誤,
因為 Thrift 有定義 64bit 整數的型態,然後API裡面有一個 readI64 的函式,好像是在合成兩個 32bit 的整數,
我自己試著去把 create 產生的 fileid 印出來,跟 HadoopThriftServer 進行比對,
發現總是對不起來,因為 create 產生的是 getRandom().nextLong() 好像都是滿滿 64bit 的長整數,
將他替換成 nextInt() 重新編譯就沒有問題了。
#org/apache/hadoop/thriftfs/HadoopThriftServer.java 50行 -- private long nextId = new Random().nextLong(); ++ private long nextId = new Random().nextInt();
[參考資源]