Javaで並列プログラミングを行うにはどうすればよいですか?そのための特別なフレームワークはありますか?どうやってものを機能させることができますか?
私はあなたに必要なものを教えます、私はウェブクローラーを開発し、それがインターネットから多くのデータをクロールすると思います。 1つのクロールシステムでは物事が適切に機能しないため、より多くのシステムを並行して動作させる必要があります。この場合、並列計算を適用できますか?例を挙げていただけますか?
純粋な並列プログラミング、つまり並行プログラミングではない場合、 MPJExpress http://mpj-express.org/ を必ず試してください。これは、mpiJavaのスレッドセーフな実装であり、分散メモリモデルと共有メモリモデルの両方をサポートしています。私はそれを試してみましたが、非常に信頼できることがわかりました。
1 import mpi.*;
2
3
/**
4 * Compile:impl specific.
5 * Execute:impl specific.
6 */
7
8 public class Send {
9
10 public static void main(String[] args) throws Exception {
11
12 MPI.Init(args);
13
14 int rank = MPI.COMM_WORLD.Rank() ; //The current process.
15 int size = MPI.COMM_WORLD.Size() ; //Total number of processes
16 int peer ;
17
18 int buffer [] = new int[10];
19 int len = 1 ;
20 int dataToBeSent = 99 ;
21 int tag = 100 ;
22
23 if(rank == 0) {
24
25 buffer[0] = dataToBeSent ;
26 peer = 1 ;
27 MPI.COMM_WORLD.Send(buffer, 0, len, MPI.INT, peer, tag) ;
28 System.out.println("process <"+rank+"> sent a msg to "+ 29 "process <"+peer+">") ;
30
31 } else if(rank == 1) {
32
33 peer = 0 ;
34 Status status = MPI.COMM_WORLD.Recv(buffer, 0, buffer.length, 35 MPI.INT, peer, tag);
36 System.out.println("process <"+rank+"> recv'ed a msg\n"+ 37 "\tdata <"+buffer[0] +"> \n"+ 38 "\tsource <"+status.source+"> \n"+ 39 "\ttag <"+status.tag +"> \n"+ 40 "\tcount <"+status.count +">") ;
41
42 }
43
44 MPI.Finalize();
45
46 }
47
48 }
MPJ Expressなどのメッセージングライブラリによって提供される最も一般的な機能の1つは、実行中のプロセス間のポイントツーポイント通信のサポートです。このコンテキストでは、同じコミュニケーター(たとえばMPI.COMM_WORLDコミュニケーター)に属する2つのプロセスは、メッセージを送受信することで互いに通信できます。 Send()メソッドのバリアントを使用して、送信者プロセスからメッセージを送信します。一方、送信されたメッセージは、Recv()メソッドのバリアントを使用して受信側プロセスで受信されます。送信側と受信側の両方が、受信側で一致する着信メッセージを見つけるために使用されるタグを指定します。
行12でMPI.Init(args)メソッドを使用してMPJ Expressライブラリを初期化した後、プログラムはそのランクとMPI.COMM_WORLDコミュニケーターのサイズを取得します。両方のプロセスは、行18のバッファーと呼ばれる長さ10の整数配列を初期化します。送信側プロセス(ランク0)は、msg配列の最初の要素に値10を格納します。 Send()メソッドのバリアントを使用して、msg配列の要素を受信側プロセスに送信します。
送信側プロセスは、27行目でSend()メソッドを呼び出します。最初の3つの引数は、送信されるデータに関連しています。送信側のbu!er — bu!er配列は、最初の引数の後に0(o!set)と1(count)が続きます。送信されるデータはMPI.INTタイプで、宛先は1(ピア変数)です。データ型と宛先は、Send()メソッドの4番目と5番目の引数として指定されます。最後の6番目の引数はタグ変数です。タグは、受信側でメッセージを識別するために使用されます。メッセージタグは通常、特定のコミュニケーター内の特定のメッセージの識別子です。一方、受信プロセス(ランク1)は、ブロッキング受信メソッドを使用してメッセージを受信します。
Javaはスレッドをサポートしているため、マルチスレッドを使用できますJavaアプリケーション。ConcurrentProgramming in Java:Design Principles and Patternsbookそのために:
Java Parallel Processing Framework( [〜#〜] jppf [〜#〜] )を見たい
Hadoop および Hadoop Wiki をご覧ください。これは、Googleのmap-reduceに触発されたApacheフレームワークで、複数のシステムを使用して分散コンピューティングを行うことができます。 Yahooのように、Twitterはそれを使用します( Sites Powered By Hadoop )。使用方法の詳細については、この本を参照してください Hadoop Book 。
Ateji PX parallel-forループはあなたが探しているものですか?これにより、すべてのサイトが並行してクロールされます(forキーワードの横にある二重バーに注意してください)。
for||(Site site : sites) {
crawl(site);
}
クロールの結果を作成する必要がある場合は、おそらく次のような並列理解を使用する必要があります。
Set result = set for||{ crawl(site) | Site site : sites }
ここでさらに読む: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf
Javaランタイムライブラリの一部であるスレッドを使用して並列処理が行われます
同時実行性チュートリアル は、Javaおよび並列プログラミング。
私は数年前の会議でそれについて聞いたことがあります- ParJava 。しかし、プロジェクトの現在の状況についてはわかりません。
私の知る限り、ほとんどのオペレーティングシステムでは、Javaのスレッドメカニズムは実際のカーネルスレッドに基づいている必要があります。これは、並列プログラミングの将来性から優れています。 Pythonのような他の言語は、単にプロセッサの時間多重化を行います(つまり、マルチプロセッサマシンで重いマルチスレッドアプリケーションを実行すると、1つのプロセッサのみが実行されます)。
それをグーグル検索するだけで簡単に見つけることができます。例として、これは「Javaスレッド」の最初の結果です。 http://download-llnw.Oracle.com/javase/tutorial/essential/concurrency/
基本的には、Threadクラスを拡張し、「run」メソッドを他のスレッドに属するコードでオーバーロードし、拡張したクラスのインスタンスで「start」メソッドを呼び出します。
また、何かスレッドセーフにする必要がある場合は、 同期メソッド をご覧ください。
Java.util.concurrencyパッケージとBrian Goetzの本「Java concurrency in practice」
Ralph Johnson(GoFデザインパターンの作成者の1人)による並列パターンに関する多くのリソースもここにあります。 http://parlab.eecs.berkeley.edu/wiki/patterns/patterns
これを見ましたか:
http://www.javacodegeeks.com/2013/02/Java-7-forkjoin-framework-example.html?ModPagespeed=noscript
フォーク/参加フレームワーク?
私もこれについて少し学ぼうとしています。
Javaチュートリアル。 http://download-llnw.Oracle.com/javase/tutorial/essential/concurrency/procthread.html のスレッドのセクションを読んでください。
Hadoopをチェックしてみてください。任意の量のボックスでジョブを実行するように設計されており、すべての簿記を処理します。これは、GoogleのMapReduceとその関連ツールに触発されたもので、Webインデックス作成からも生まれています。
Java SE 5および6では、Java.util.concurrent。*に一連のパッケージが導入され、強力な同時実行性ビルディングブロックが提供されます。詳細については、これを確認してください。 http://www.Oracle.com/technetwork/articles/Java/fork-join-422606.html
Habanero-Java (HJ)というライブラリがあります。これは、ライス大学で開発され、 lambda式 を使用して構築され、任意のJava = 8 JVM。
HJ-libは、さまざまな並列プログラミング構成(非同期タスク、フューチャー、データ駆動タスク、forall、バリア、フェーズ、トランザクション、アクターなど)を単一のプログラミングモデルに統合し、これらの構成の独自の組み合わせ(ネストなど)タスクとアクターの並列性の組み合わせ)。
HJランタイムは、HJタスクの作成、実行、終了を調整し、ワークシェアリングとワークスティーリングの両方のスケジューラを備えています。チュートリアルに従って、コンピューターにセットアップすることができます。
次に、簡単なHelloWorldの例を示します。
import static edu.rice.hj.Module1.*;
public class HelloWorld {
public static void main(final String[] args) {
launchHabaneroApp(() -> {
finish(() -> {
async(() -> System.out.println("Hello World - 1!"));
async(() -> System.out.println("Hello World - 2!"));
async(() -> System.out.println("Hello World - 3!"));
async(() -> System.out.println("Hello World - 4!"));
});
});
}}
各asyncメソッドは、他のasyncメソッドと並行して実行されますが、これらのメソッド内のコンテンツは順次実行されます。プログラムは、finishメソッド内のすべてのコードが完了するまで続行しません。
jCSP( http://www.cs.kent.ac.uk/projects/ofa/jcsp/ )を使用できます。ライブラリはJavaでCSP(Communicating Sequential Processes)原則を実装し、スレッドレベルであり、代わりにプロセスを処理します。
サンプルライブラリを使用した簡単な回答
Javaを使用した並列処理に興味がある場合は、Hazelcast Jetを試してみることをお勧めします。
私の側からこれ以上言葉は必要ありません。ウェブサイトを確認し、その例で学ぶだけです。データを完全に処理することの意味について、かなり堅実な背景と想像力を与えます。
Parallel Java 2 Library を試してみてください。
アラン・カミンスキー教授はウェブサイトで次のように書いています:
PJ2の開発を開始した2013年に早送りします。並列コンピューティングは、10年前をはるかに超えて拡大していました。マルチコアパラレルコンピューターには、より多くのCPUコアとはるかに大きなメインメモリが装備されていたため、クラスター全体を必要としていた計算が単一のマルチコアノードで実行できるようになりました。新しい種類の並列計算ハードウェア、特にグラフィック処理ユニット(GPU)アクセラレータが一般的になりました。 AmazonのEC2などのクラウドコンピューティングサービスにより、誰でも数千のコアを持つ仮想スーパーコンピューターで並列プログラムを実行できました。並列コンピューティングの新しいアプリケーション分野、特にビッグデータ分析が開かれました。 GPU並列プログラミング用のOpenCLやNVIDIA CorporationのCUDAなどの新しい並列プログラミングAPI、およびビッグデータコンピューティング用のApacheのHadoopなどのmap-reduceフレームワークが登場しました。これらのすべての傾向を調査して活用するために、まったく新しいParallel Java 2 Libraryが必要であると判断しました。
2013年初頭にPJ2
はまだ利用できませんでした(以前のバージョンは利用できましたが)、私はJava Parallel Processing Framework
(JPPF)。 JPPFは大丈夫でしたが、一見PJ2
面白そうです。