1. Linux環境で構成された嵐
ホスト名 | Tugel | tuge2 | tuge3 |
---|---|---|---|
展開環境 | 飼育係/ニンバス | 飼育係/スーパーバイザー | 飼育係/スーパーバイザー |
(展開一目ビュー)
飼育係1.1構成環境(3台のマシンを設定する、あなたは1を設定し、配布することができます)
ダウンロードするには、公式ウェブサイトに行くのApache ZooKeeperの--3.5.5-bin.tar.gzをして、Linuxのは/ opt / ZooKeeperのディレクトリにアップロード。(あなたは、次の作成しない場合。)
減圧
タール-xvfのapache-飼育係-3.5.5-bin.tar.gz
設定環境
vimのは/ etc / profile
export ZK_HOME=/opt/zookeeper/apache-zookeeper-3.5.5-bin export PATH=$ZK_HOME/bin:$PATH
きれいな自動飼育係の構成ログ
に配置することによりautopurge.snapRetainCountとautopurge.purgeIntervalをこれら2つのパラメータは、定期的な清掃を可能にします。
両方のパラメータが除去フロントNotesでzoo.cfgに配置され、修正の数は、ログを保持するために必要な:autopurge.purgeIntervalは、このパラメータは、1以上の整数を完了するために必要な時間、で、デフォルトの手段は、独自のクリーンアップ機能を開けないでください0、で、クリーンアップの頻度を指定します。
autopurge.snapRetainCountこのパラメータと、このパラメータを使用して上記のパラメータを使用して、保持したいファイルの数を指定します。デフォルトでは、3を保持することです。
1.2 Java環境の設定(3台のマシンを設定する必要があります)
ダウンロードする公式サイトに移動JDK-8u221-のLinux-x64.tar.gzをし、その後は/ opt / javaのディレクトリにアップロードします。(作成されていない場合には、Java8 +バージョンをダウンロードするには、公式ウェブサイトによります)
減圧
タール-xvf JDK-8u221-linuxの-x64.tar.gz
設定環境
vimのは/ etc / profile
export JAVA_HOME=/opt/java/jdk1.8.0_221 export PATH=$JAVA_HOME/bin:$ZK_HOME/bin:$PATH
ストーム1.3構成環境(3台のマシンを設定する必要があります)
地球環境の設定
- ダウンロードするには、公式ウェブサイトに行くのApache-ストーム-2.1.0.tar.gzをし、その後は/ opt /嵐のディレクトリにアップロードします。(下に作成されていません)
- 減圧
タール-xvfのapache-嵐-2.1.0.tar.gz
- 設定環境
vimのは/ etc / profile
export STORM_HOME=/opt/storm/apache-storm-2.1.0 export PATH=$STORM_HOME/bin:$JAVA_HOME/bin:$ZK_HOME/bin:$PATH
- 設定ファイルをリロード
ソースは/ etc / profile
- ダウンロードするには、公式ウェブサイトに行くのApache-ストーム-2.1.0.tar.gzをし、その後は/ opt /嵐のディレクトリにアップロードします。(下に作成されていません)
Storm.yaml設定ファイル
vimの/opt/storm/apache-storm-2.1.0/conf/storm.yaml
- 飼育係のサーバーの構成:
# storm.zookeeper.servers: # - "server1" # - "server2"
変更
storm.zookeeper.servers: - "tuge1" - "tuge2" - "tuge3"
- 飼育係のサーバーの構成:
状態のディレクトリを作成します。
嵐のローカルディレクトリを作成し、権限を変更
MKDIR -p /opt/storm/apache-storm-2.1.0/status
storm.local.dir: "/opt/storm/apache-storm-2.1.0/status"
マスターノードアドレスを設定します
nimbus.seeds: ["tuge1"]
コンピューターの設定ワーカー数(実際の生産環境は、タスクの実行に基づいて構成されており、ここにされて、私は最初の4つの構成を学ぶために公式サイトを参照してください)
複数のポートを追加し、あなたには、いくつかの労働者を割り当てることができます。ここでは、4つの第1の構成。
次のstorm.yamlを追加します。
supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703
1.4以降の嵐
まずスタート飼育係は、3つの参照ブログを開始する前に、具体的な手順を活性化します
ニンバス開始とUIは、tuge1上で実行します
./storm nimbus >./logs/nimbus.out 2>&1 & ./storm ui >>./logs/ui.out 2>&1 &
スタートスーパーバイザー、tuge2上で実行されている、tuge3
./storm supervisor >>./logs/supervisor.out 2>&1 &
PS:> DEV>平均ヌル2>&1標準誤差出力に入力され、出力は、標準のファイルDEVヌルに、最終&意味背景内部入力されます。
アクセスUIページ:のhttp:// tuge1:8080 /
(PS:開始するかどうかは何も異常な、見た目の飼育係はJPSを使用することに加えて、存在する場合は、起動するかどうかをnumbusやスーパーバイザーを見ます)
如果报异常は:シードホスト[tuge1]からのリーダーの雨雲が見つかりませんでした。あなたは、設定nimbus.seedsのための雨雲のホストの有効なリストを指定しましたか?
zkCli.sh、コンソールに飼育係をして、嵐のノードを削除します。実行ZooKeeperのbinディレクトリに移動してください。
注:唯一の削除ノードは子ノードが含まれていない削除、ノードを削除したい場合は、子ノードが含まれている、コマンドRMRを使用
再起動してZooKeeperのノード:
ビン/ zkServer.sh再起動いいえ問題は、あなたは〜次のインターフェイスの友人を見ることはできません
ローカルに実行2.Storm
ここでは、追加コンテンツの小さな例言葉は次のとおりです。
Mavenプロジェクトを作成し、次のクラス構造を追加します。
次のようにコードは(アイデアを参照された上でアーキテクチャストロークシス):
App.java(入口カテゴリ):
package Demo.Storm;
import java.util.Map;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.LocalCluster.LocalTopology;
import org.apache.storm.generated.StormTopology;
import org.apache.storm.thrift.TException;
import org.apache.storm.topology.TopologyBuilder;
import Demo.Storm.TestWordSpout;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
try {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("words", new TestWordSpout(), 6);//6个spout同时运行
builder.setBolt("exclaim1", new ExclamationBolt1(), 2).shuffleGrouping("words");//2个bolt同时运行
builder.setBolt("exclaim2", new ExclamationBolt2(), 2).shuffleGrouping("exclaim1");//2个bolt同时运行
LocalCluster lc = new LocalCluster();//设置本地运行
lc.submitTopology("wordadd", new Config(), builder.createTopology());//提交topology
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
ExclamationBolt1.java(Bolt1):
package Demo.Storm;
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
public class ExclamationBolt1 extends BaseRichBolt {
OutputCollector _collector;
public void prepare(Map<String, Object> topoConf, TopologyContext context, OutputCollector collector) {
// TODO Auto-generated method stub
_collector=collector;
}
public void execute(Tuple input) {
// TODO Auto-generated method stub
String val=input.getStringByField("words")+"!!!";
_collector.emit(input, new Values(val));//input用来标识是哪个bolt
_collector.ack(input);//确认bolt
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("exclaim1"));
}
}
ExclamationBolt2.java(Bolt2):
package Demo.Storm;
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Tuple;
public class ExclamationBolt2 extends BaseRichBolt {
OutputCollector _collector;
public void prepare(Map<String, Object> topoConf, TopologyContext context, OutputCollector collector) {
// TODO Auto-generated method stub
this._collector=collector;
}
public void execute(Tuple input) {
// TODO Auto-generated method stub
String str= input.getStringByField("exclaim1")+"~~~";
System.err.println(str);
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
}
}
TestWordSpout.java(継続的にデータをストリーミング):
package Demo.Storm;
import java.util.Map;
import java.util.Random;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;
public class TestWordSpout extends BaseRichSpout {
SpoutOutputCollector _collector;
public void open(Map<String, Object> conf, TopologyContext context, SpoutOutputCollector collector) {
// TODO Auto-generated method stub
_collector=collector;
}
public void nextTuple() {
// TODO Auto-generated method stub
Utils.sleep(100);
final String[] words = new String[] { "你好啊", "YiMing" };
final Random rand = new Random();
final String word = words[rand.nextInt(words.length)];//司机发送字符串
_collector.emit(new Values(word));
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("words"));
}
}
pom.xm(Mavenの設定ファイル、問題は後述参照している場合):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Demo</groupId>
<artifactId>Storm</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Storm</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-client -->
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-client</artifactId>
<version>2.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-server -->
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-server</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
</project>
次のように動作した結果は以下のとおりです。
問題が発生しました:
一つの問題:LocalClusterこのクラスは明らかに存在するが、導入していませんか?
ソリューション:まず、差異ジャーパッケージを見て、導入することができますが、このjarファイルのパッケージが灰色であるということです、そして無知な表情は、それがこの事と推定されています。なぜいくつかの検索、オンライン検索パッケージは灰色で、彼女はポンポンとがあることに答えを持っています
嵐の8グループポリシー
1)shuffleGrouping(ランダム)
一つの同じ単語がボルトに送信することが可能に係るパケットの2)fieldsGrouping(フィールド、すなわち、)
3)allGrouping(放送伝送、すなわち各タプルは、各ボルトを受けます)
4)タスクのタスクID最小値に割り当てられた(グローバルパケットタプル)globalGrouping
5)noneGrouping(無作為)
6)directGrouping(直接パケット、タプルボルトが伝送関係に対応する指定)
7)地域やシャッフルのグループ化
8)customGrouping(カスタムグループ化)
Linuxクラスタ上3.Stormラン
ここで小さな例数の単語数は次のとおりです。
上記、次のような構造に基づいて、プロジェクトで、次のクラスファイルを追加していきます。
コードは以下の通りであります:
WordCountApp.java(クラスエントリ)
package Demo.Storm;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;
public class WordCountApp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("words", new WordCountSpout(), 8);//8个Spout同时执行
builder.setBolt("wordSplit", new WordCountSplitBolt(), 3).shuffleGrouping("words");//3个Bolt同时执行
builder.setBolt("wordSum", new WordCountSumBolt(), 3).fieldsGrouping("wordSplit", new Fields("word"));//3个Bolt同时执行
if (args.length > 0) {//如果有参数,走集群执行
try {
StormSubmitter.submitTopology(args[0], new Config(), builder.createTopology());
} catch (Exception ex) {
ex.printStackTrace();
}
} else {//没有参数走本机执行
try {
LocalCluster lc = new LocalCluster();
lc.submitTopology("wordCount", new Config(), builder.createTopology());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
WordCountSpout.java(データの安定した流れを提供します)
package Demo.Storm;
import java.util.Map;
import java.util.Random;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;
public class WordCountSpout extends BaseRichSpout {
SpoutOutputCollector _collector;
public void open(Map<String, Object> conf, TopologyContext context, SpoutOutputCollector collector) {
// TODO Auto-generated method stub
this._collector=collector;
}
public void nextTuple() {
// TODO Auto-generated method stub
Utils.sleep(1000);
String[] words=new String[] {
"hello YiMing",
"nice to meet you"
};
Random r=new Random();
_collector.emit(new Values(words[r.nextInt(words.length)]));//随机传递一个字母
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("words"));
}
}
WordCountSplitBolt.java(分割型)
package Demo.Storm;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
public class WordCountSplitBolt extends BaseRichBolt {
OutputCollector _collector;
public void prepare(Map<String, Object> topoConf, TopologyContext context, OutputCollector collector) {
// TODO Auto-generated method stub
this._collector = collector;
}
//传递分割后的字母
public void execute(Tuple input) {
// TODO Auto-generated method stub
String line=input.getString(0);
String[] lineGroup= line.split(" ");
for(String str:lineGroup) {
List list=new Values(str);
_collector.emit(input, list);
_collector.ack(input);
}
}
//声明传递的字母名称为 word,下一个bolt可以通过此名称获取
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("word"));
}
}
WordCountSumBolt.java(誘導統計カテゴリ)
package Demo.Storm;
import java.util.HashMap;
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Tuple;
public class WordCountSumBolt extends BaseRichBolt {
OutputCollector _collector;
Map<String, Integer> map = new HashMap<String, Integer>();
public void prepare(Map<String, Object> topoConf, TopologyContext context, OutputCollector collector) {
// TODO Auto-generated method stub
this._collector = collector;
}
//归纳统计
public void execute(Tuple input) {
// TODO Auto-generated method stub
String word = input.getString(0);
if (map.containsKey(word)) {
map.put(word, (map.get(word) + 1));
} else {
map.put(word, 1);
}
System.err.println("单词:" + word + ",出现:" + map.get(word) + "次");
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
}
}
あなたは、準備コンパイラパッケージであり、それ上のLinuxにそれをアップロードするとき。
/opt/storm/apache-storm-2.1.0/bin実行に
[ルートtuge1ビン@]#の./stormジャー/opt/data/storm/WordCount.jar Demo.Storm.WordCountAppトイレ
公式の例を実行します。
storm jar all-my-code.jar org.apache.storm.MyTopology arg1 arg2
タスクの終了
嵐キルWC(つまり、トポロジ名)
https://blog.csdn.net/cuihaolong/article/details/52684396:結果を取得するには、を参照してください。
PS:操作中に、タスクを変更することはできませんが、労働者と実行者を変更することができます。
ZJ ...