PHPで1000スレッドでテラバイトのデータを処理する方法-Hadoop / MapReduce

みなさんこんにちは!



すでにBigdataを聞いたことがありますか? ええ、はい、ウェブは成長​​しています。より多くのデータがあり、それらを管理し、定期的に分析する必要があります。 負荷がかかるとデータベースがバーストします。リレーショナル理論ではタスクに完全に対応できず、解決策が必要です。 マーケティングは積極的に上から押しつぶし、鉄は鋭い角で下から押しつぶし、自殺します。



この投稿では、特定の作業レシピとコードの一部を、PHPでの処理方法> =テラバイトin> = 1000スレッドの処理方法に関する簡単な理論的結論とともに説明します。 時間を無駄にせず、理論で頭を詰まらせることなく、問題を解決できます。



しかし、突然吐き気とめまいになった場合、あなたはもはや読むことができません-しかし、美しい鳥を賞賛し、上記のことを忘れてください。 しかし、警戒してください、Bigdataは明日ドアを拾ってノックするかもしれません;-)







通常行われているように





ウェブ上でいつものように。 バーストするまでデータベースにデータを追加します。 破裂した場合、MySQLシャーディング、 パーティショニングに関する会話が始まり、RAM 内のマルチマスタークラスターについて記憶します。



役に立たない場合は、 redisなどのNoSQLソリューションまたはDynamoDBなどのクラウドサービスの検索と実装が開始されますSphinxボリュームデータの優れた検索エンジンであることが証明されています。



無意識のうちに、計算が進行中です-データベースに保存して、情報を分析します。 そして、それはしばしば機能します。 しかし、常にではありません...そして、この「常にではない」がより一般的になっています。



さらに多くのデータ、オンライン分析が必要





ビジネスに答えることは常に可能とは限りません-1日待って、ログ/データを分析し、数字を与えます。 多くの場合、ビジネスではライブ矢印を使用して楽器の状況を管理するために、オンラインで番号を取得することが重要です。





パイロットのためにホテルで1日1回ブラックボックスに記録された情報を分析して飛行機を操縦することを想像するのは怖いです:-)







データフローがさらに激しくなる場合、またはビジネスロジックがまだ処理されていないデータに関する最新情報の可用性を必要とする場合...次に、次のような「ストリーム分析」のツールを使用できます。

1) ピンバ

2) Amazon Kinesis

3) nginx / ragelに基づくストリームパーサー



これらの貴重なツールを紙と鉛筆で少なくとも1回理解することは有益です。さらに便利なのは、少なくとも1晩、マニュアルとプロトタイプを使って「眠る」ことです。





セットアップと操作の容易さ、および作成される最小負荷のために、ここでピンバを特に取り上げたいと思います。 js Navigation Timing APIに基づいて、クライアントのブラウザでWebアプリケーションのパフォーマンスに関する統計情報のコレクションを整理するには、PHPの2つのファイルで30行で実行されます。



オンラインでデータを分析できない場合、蓄積されたデータおよび関連するアルゴリズムの並列分析に対するソリューションの検索が開始されます。



データ配列の並列処理





オブジェクトのリストがあります。たとえば、これらはs3クラウド内のファイルであり、そのうち数千万個あるとします。 クラウドをどのように信頼しても、これらのファイルを別のクラウド/サーバーに定期的にアップロードする必要があります。 各ファイルは暗号化、圧縮され、他の操作が行われ、コピーされます。



自然界には多くの同様のタスクがあります。





これらのタスクは、一般的な分割統治アルゴリズムに分類されます。

-タスクをパーツに分配します

-各パーツを個別に、他のパーツと並行して処理します

-集計による結果の結合





PHPの場合、 RabbitMQGearmanなどのキューを使用してこの問題の解決を試みることができますが、例外的な状況、一般的なファイルシステムのシャーディング、20台のサーバーでのクラスタリングなどを解決するために多くの作業を行う必要があります。



したがって、1台のサーバーで30のPHPスレッドでタスクを解決できる場合、通常、リストされているツールで十分です。 ただし、「不運」で1時間に数テラバイトを処理し、必要な量をアイロンにかける必要がある場合は、解決策があります:-)



はい、はい、もちろんこれはHadoopです 。これは上の女の子の写真と相関するMapReduceパラダイムを実装します;-)



さらに読むのが面倒でレシピを知りたい人は、元の問題の例とHadoopでの解決策を以下に示します。



バケット1 s3からバケット2 s3に1,000万個のファイルを圧縮、暗号化、転送する必要があります。

サーバーでPHPツールを実行する場合、それぞれ独自のプロセスで実行される最大20〜30のPHPスレッドをフォークできます。 そして、それは数週間かかります。 そして、データの量は増え続けており、システムソリューションが必要です。

Hadoopで同じことを行うと、タスクは1時間で完了できますが、大量の鉄片で完了します。 各スレッドに15スレッドの鉄を適当な数だけ選択すると、2日間を満たすことができます。

つまり 処理するファイルの数が6か月で1,000万から5,000万に増えた場合、Hadoopクラスター起動構成の1桁のみを変更するだけで、鉄片の数のみが増加します。

それは美しくて体系的ではありませんか? :-)




Hadoop





一般に、これはかなり大きな製品であり、おそらくマニュアルを読むのに24/7週間は十分ではありません-しかし、これは必須ではありません。 このテクノロジーを効率的かつ迅速に使用して、あなたと私たちの時間を節約する方法を学びます。



設置




Javaソフトウェアのインストールに加えて、クラスターファイルシステムも構成する必要があります。 理由-クラスターノードはどのように共有ファイルを交換しますか? しかし、私たちはトリッキーになります-AmazonでHadoopクラスター起動します 。 すべてがすでに構成され、インストールされています。



マップの準備とスクリプトの削減




これが投稿で最も興味深いものです。 Hadoopでは、任意の言語のスクリプトを使用できます。また、bashでファイルを並べ替えたり、PHP / Python / Perlで処理したりできます。



スクリプトは標準入力から読み取られ、標準出力に書き込まれます。 さて、もっと簡単なことは何でしょうか?



マッパー、レデューサーの2つのスクリプトが必要です。



Nサーバーでタスクを並列化する必要がある場合-マッパーを1つ作成するだけです。



マッパーの例




#!/usr/bin/php <?php error_reporting(-1); set_time_limit(0); ini_set('memory_limit', '2048M'); gc_enable(); require '/usr/share/php/aws.phar'; $fp=fopen("php://stdin","r"); while (true) { $line=stream_get_line($fp,65535,"\n"); //    : , , ,  ... } echo "s3 copied direct\t".$copy_count."\n"; echo "s3 copied precond\t".$copy_precond_count ."\n"; echo "s3 src not found\t".$s3_src_not_found ."\n";
      
      







集約された統計が必要ない場合、2番目のスクリプトは必要ありません。 必要に応じて、reducerを記述します。



減速機の例




 #!/usr/bin/php <?php error_reporting(-1); ini_set('memory_limit', '1024M'); set_time_limit(0); gc_enable(); $ar_reduce = array(); while (($line = fgets(STDIN)) !== false) { $line = str_replace("\n","",$line); $ar_line = explode("\t", $line); if ( !isset($ar_reduce[$ar_line[0]]) ) $ar_reduce[$ar_line[0]] = 0; $ar_reduce[$ar_line[0]] += intval($ar_line[1]); } foreach ($ar_reduce as $key=>$value) { echo $key."\t".$value."\n"; } ?>
      
      







クラスタサーバーの初期化




なぜなら スクリプトはPHPにあるため、クラスター内の各サーバーで実行される初期化スクリプトを準備する必要があります。

 sudo apt-get -y update sudo apt-get -y install libssh2-php sudo apt-get -y install php5-curl sudo rm -f /etc/php5/cli/conf.d/suhosin.ini sudo mkdir -p /usr/share/php cd /usr/share/php sudo wget https://github.com/aws/aws-sdk-php/releases/download/2.5.0/aws.phar ...
      
      







PHPのスクリプトをアップロードしてクラウドにバッシュ(s3)




 for FILE in bkp_s3_folder_hadoop_bootstrap.sh bkp_s3_folder_hadoop_mapper.php bkp_s3_folder_hadoop_reducer.php; do s3cmd -c /root/.s3cfg-key put /home/project/cron_jobs/$FILE s3://# #/code/ done
      
      







S3で処理するデータをアップロードする




単純に、たとえば、s3cmdを使用して、処理用のソースデータをs3のフォルダーにアップロードします。 このデータは、クラスター全体に自動的に広がります。 好きなだけデータをアンロードして、クラスターにそれらの影響を与えることができます。



クラスターでのデータ処理の開始




そして最後に、このようなおいしいおやつ-データを処理するクラスターを起動します。



 D=$(date +"%Y-%m-%d_%H-%M-%S") /opt/aws/emr/elastic-mapreduce --create --stream \ --name myproject_$D \ --step-name step_$D \ --with-termination-protection \ --step-action CANCEL_AND_WAIT \ --ami-version '2.4.2' \ --bootstrap-action '#    , . #' \ --bootstrap-action 's3://elasticmapreduce/bootstrap-actions/configure-hadoop' \ --args "-m,mapred.map.max.attempts=20,-m,mapred.tasktracker.map.tasks.maximum=15,-m,mapred.task.timeout=600000" \ --input 's3://#     #/input/' \ --mapper 's3://# #/code/# mapper#.php' \ --reducer 's3://# #/code/# reducer#.php' \ --output 's3://#  #/output_'$D \ --log-uri 's3://#  #/logs/' \ --num-instances 5 \ --master-instance-type m1.small \ --slave-instance-type m1.xlarge \ --key-pair 'myproject_mapreduce'
      
      







クラスターの伝播に適切な数の鉄片を選択することが重要です-もちろん、より多くの場合、より速くなります。 この例では、1つのサーバーにインストールするプロセスは15個までです。 RAMの量によって異なりますが、注意してください-その消費を監視します。



クラスターを処理した後、ログで集計された統計を確認できます。ログはs3にもアップロードされます。



通常、数週間前に行われていた処理速度は、「300スパルタン」の最後の部分よりも悪くない、ITの継続性を驚かし、刺激し、新たなレベルの意識を高めます。





まとめ





その結果、2つのPHPスクリプトで管理されるビジネスツールができました。 サーバーの数(--num-instances 5)は、ロードされたデータ配列の処理速度に直接影響します。 原則として、それぞれが10スレッドの100台のサーバーを起動し、ジョブキューを使用して1台のサーバーで実行できるよりもはるかに高速にデータを処理することを禁止する人はいません。



私たちのプロジェクトの 1つで、このテクノロジーをシンプルでわかりやすい方法で使用して、s3の数千万のオブジェクトの処理時間を数週間から2日に短縮しました。



同僚、質問がある場合は、コメントで質問して会議に参加してください。経験をお聞かせください。 そして、Bigdataを介したWebプロジェクトと勝利の実装で皆さんに幸運を!



All Articles