phpHiveAdminソフトウェア開発と知識整理(hive読み出しバックグラウンドlog)

11309 ワード

Hiveインタフェースにアクセスするにはthriftがありますが、これはあまり言うことはありません.パッケージされた方法を呼び出せばいいだけです.以前はSocketのブロックの問題で、Hiveインタフェースの読み取りがタイムアウトすることがよくあったので、Thriftの中のTSocketを修正します.phpでいいです.修正方法は以前のphp開発Hive webクエリーを参照してください.ネット上の他の関連記事とは少し違います.
 
データベースの管理面では主にページ変数を取得し、sql文字列をつづるのも言うまでもないようです.Hiveマニュアルをたくさん見ればできます.
 
コアコンテンツはクエリー部分で、これは比較的面白いところで、最初の1版のクエリーは完全にthriftで完成して、クエリーは特に遅くて言わないで、肝心なのは進度が戻っていないので、その上中間でウィンドウを閉じると完全に任務が見つかりません.当時、タオバオのHiveインタフェースがうらやましく、map/reduce進捗バーがありました.そこで自分で2日間調整してmap/reduce進捗を取得する方法を書きました.進捗バーはありませんが、Hiveが実行するmap/reduce進捗を読み取り、リアルタイムで戻ることができます.その核心的な考え方はhiveコマンドラインがmr進捗をコンソールのstdoutとstderrに印刷できる以上、プログラムを書いてコマンドラインが実行するstdoutとstderrを読めばいいということです.しかし、リアルタイムでWebページに出力するには、読みながら書く必要があります.phpにとっては難しいです.phpプログラマーにとって、ほとんどはWebページを開発しており、スレッドやプロセス管理に使われることは非常に少なく、極めて少ない.phpのWebページの特徴に基づいて.ajaxを使用しない場合、php自体はプロセスを非同期に処理できません.しかし、システム実行はバックエンドであり、Webページとは無関係であるため、phpがオペレーティングシステムの面で非同期実行を行う問題である.pcntlはサブプロセス管理で便利ですが、phpコンパイル時にenableが必要です.私は自分に迷惑をかけたくありません.特に他のユーザーに困難を与えたくないので、proc_を選びました.Openは、非同期の処理を完了するために新しいプロセスを開きます.なぜJava開発を選んでいないのか、python開発を選んでいないのかについても、phpよりもjavaやpythonのウェブページの開発が小衆なのか、LNMPの構成が大衆化される可能性があり、ビッグデータを手に入れるのが楽になるかもしれません.しかし、将来javaやpythonでもう1版書くことも排除できません.どうせ書き終わったら、他の人に自分でクラスタを調べてもらいます.私も大丈夫です.暇でも暇です.
 
だからコアは下にあります.
 
hiveクエリがページを介してコマンドラインに送信され、サーバ上でproc_を介してページが実行されます.Openはphpプロセスを作成し、Hiveコマンドライン実行から返されたstdoutとstderrを読み出し、実行プロセスの出力を一時ファイルに書き込む.するとフロントエンドのページがこのファイルを読み取り、内容を逆さまに並べてページに戻し、map/reduceのリアルタイム読み取りが完了します.言うのは簡単だが、書くのは難しい.また,Linux基本環境の構成,HADOOP,HIVE,JAVA環境変数への出力にも関与する.通常phpはnobodyまたはwwwのようなユーザーの下で動作し、このようなユーザーのデフォルトshellは/sbin/nologinであり、このようなユーザーは環境変数を取得しないようだ.したがって、Hiveコマンドラインクエリを送信する前に、環境変数をオペレーティングシステムに送信する必要があります.この新しいプロセス全体に環境変数の問題を発見するなど、2日間調整が行われました.
 

  
  
  
  
  1. public function NonBlockingRun($pCmd,$pTimestamp,$pFilename,$pType,&$pCode
  2.     global $env
  3.     $descriptorspec = array
  4.         0 => array("pipe""r"),   
  5.         1 => array("pipe""w"),  
  6.         2 => array("pipe""w"
  7.     ); 
  8.  
  9.     $pipesarray(); 
  10.      
  11.     $process = proc_open($pCmd$descriptorspec$pipes); 
  12.  
  13.     $output""
  14.  
  15.     if (!is_resource($process)) 
  16.     { 
  17.         return false; 
  18.     } 
  19.  
  20.     fclose($pipes[0]); 
  21.  
  22.     stream_set_blocking($pipes[1],0); 
  23.     stream_set_blocking($pipes[2],0); 
  24.      
  25.     $todoarray($pipes[1],$pipes[2]); 
  26.  
  27.     $fp = fopen($pFilename,"w"); 
  28.     #fwrite($fp,$pTimestamp."

    "
    ); 
  29.     while( true ) 
  30.     { 
  31.         $readarray();  
  32.         #if( !feof($pipes[1]) ) $read[]= $pipes[1]; 
  33.         if( !feof($pipes[$pType]) ) $read[]= $pipes[$pType];// get system stderr on real time 
  34.          
  35.         if (!$read
  36.         { 
  37.             break
  38.         } 
  39.  
  40.         $ready= stream_select($read$write=NULL, $ex= NULL, 2); 
  41.  
  42.         if ($ready === false) 
  43.         { 
  44.             break; #should never happen - something died 
  45.         } 
  46.          
  47.         foreach ($read as $r
  48.         { 
  49.             $sfread($r,128); 
  50.             $output .= $s
  51.             fwrite($fp,$s); 
  52.         } 
  53.  
  54.     } 
  55.  
  56.     fclose($fp); 
  57.  
  58.     fclose($pipes[1]); 
  59.     fclose($pipes[2]); 
  60.  
  61.     $pCode= proc_close($process); 
  62.  
  63.     return $output

これは主にHiveコマンドラインの出力を読み取るためのコードで、このようなメリットは、すべてのHiveリリース版が食べられ、コマンドラインでコンテンツを出力できればphpHiveAdminを使うことができることです.どんなApache版でも、Cloudera版でも、使えます.不便な点は、phpHiveAdminを実行するマシンにHiveとHadoop(Hadoopを実行する必要はなく、クラスタにアクセスできればよい)を配備する必要があり、phpHiveAdminはHive実行可能ファイルに依存します.しかし、thriftインタフェースは捨てられず、thriftはライブラリ名テーブル名を取得し、Hiveがalter、drop、create、insertコマンドを管理するのに非常に使いやすい.
 
今の仕事を振り返ってみると、不思議なことでもあります.溝を吐いてください.一番早く入社したばかりの会社はデータ部門の定員で招かれたわけではありません.php webプログラマーで、オンライン部門の開発をしています.その时のリーダーは張と申します.出勤初日にプロジェクトをさせてくれました.私は2週間ぐらいかけて、scribeとawkに基づくログ収集と分析システムを構築しました.レポートを生成する以外に、基本的に私は一人で全部包みました.awkのスクリプトは全部書いて、それからあいつは私に言った.あなたのレベルが悪いから、行ってください.出勤して2週間で1つのプロジェクトを終えて、それから私を運転します.その时、ショックを受けて、人事を探してこの状況を話して、人事は私にデータ部門に転送してくれました.ちょうどデータ部門がhadoopをやっていて、陰差陽錯です.当時hadoopのインストールが大変だと思っていたので、趙さんの調査研究に基づいてスクリプトを書きました.そしてHive操作が不便だと思いphpHiveAdminと書きました.童小軍の助けを得て、phpHiveAdminは2012年1月29日にgithubにオープンした.EasyHadoopの第1版インストールスクリプトは2012年1月31日にgithubにオープンしました.
 
ここで特に会社の中の3人に感謝しなければならなくて、まずオンライン部門の張という指導者で、もしあなたが私にプロジェクトをやり終えさせたいから私を開けなければならなくて、私はデータ部門に行ってHadoopに接触することはできなくて、Hadoopに接触しなければEHMとPHAを書くことができなくて、EHMとPHAを書くことができなくて私の博客は何も書くことができません.だから、私はあなたがとても嫌いですが、感謝しなければなりません.あなたの逆天があるから、私はこのブログを書く機会があります.本当に感謝します.高級黒を突っ込むのではありません.私もあなたが夜道を歩いている間にレンガを撮りたいですが、私のために、あなたに排斥された優秀な同僚のために.だから悪口を言って、感謝すべきか感謝しなければならないか.
次に感謝するのは、データ部門の元指導者である童小軍であり、現在のEasyHadoopコミュニティで旗を掲げている人でもあり、彼の励ましと仕事の協調の下で、私はこの2つのプロジェクトを開発し、維持する時間があります.彼の努力に基づいて、オープンソース、オープンコミュニティができました.
また、元同僚の趙修湘さんは、Hadoop生態圏に関する多くの知識を教えてくれて、私たちが再び仕事をする日を望んでいます.
 
会社のデータグループのすべての同僚に感謝して、あなた达がMRの任務を分担してくれて、やっとEHMのPHAの誕生があって、あなた达は最高です.