コンピューターの仮想マシンでスタンドアロンの Spark を実行しています。Spark Streaming は Kafka からデータを取得し、それを HBase テーブルに保存してから処理し、結果を別のテーブルに保存します。
Spark Batch は、最新のエントリの処理結果のテーブルをクエリし、そこからのデータを使用して、未処理のデータ テーブルからクエリするデータを決定します。バッチ ジョブには無限の while ループがあり、終了するとバッチが再開されます。それとストリーミング ジョブの両方で、スケジューラが Fair に設定されています。
生成された情報を最初に Kafka にストリーミングし、次にストリーミング レイヤー用に別のスレッドを起動し、その後一定の遅延後にバッチ用に起動することで、これらすべてを適切な順序で実行するクライアント アプリがあります。
私の問題は、提供された 3 つのコアのうち 2 つを使用してストリーミングが実行され、文句を言わないことですが、バッチ ジョブが開始されると、ストリームは実行中であると表示されますが、バッチ ジョブがテーブルに書き込んでいる間、HBase テーブルはそれを明確に示しています。ストリーミング ジョブは何も書き込みません。また、これがすべて発生している間、ストリーミング ログは一時停止します。
実行するスレッドを設定する方法は次のとおりです。
Runnable batch = new Runnable() {
@Override
public void run() {
try {
Lambda.startBatch(lowBoundary, highBoundary);
} catch (Exception e) {
e.printStackTrace();
}
}
};
Thread batchThread = new Thread(batch);
batchThread.start();
バッチとストリーミングの開始は、次のように ProcessBuilder を介して行われます。
public static void startBatch(String low, String high) throws Exception {
// Specify executable path
String sparkSubmit = "/home/lambda/Spark/bin/spark-submit";
// Describe the process to be run
ProcessBuilder batch = new ProcessBuilder(sparkSubmit,
"--class", "batch.Batch", "--master",
"spark://dissertation:7077",
"/home/lambda/Downloads/Lambda/target/lambda-1.0-jar-with-dependencies.jar",
low, high);
// Start the batch layer
batch.start();
}
なぜそれが起こっているのか、誰かが考えを持っていますか? Spark が自分のやりたいようにタスクを管理していないのではないかと疑っていますが、どうすればよいかわかりません。