Apache Igniteの玹介最初のステップ

この蚘事の平均的な読者がApache Ignite補品に粟通しおいないこずを提案したいず思いたす。 おそらく、私はこの補品を䜿甚するための可胜なシナリオの1぀を説明しおいるHabréの蚘事を聞いたり、読んだりしたした 。 最近 、ActivitiのL2キャッシュずしおIgniteを匷制的に䜿甚するこずに぀いお曞きたした。 おそらく、これはJavaで曞かれたオヌプン゜ヌス補品であり、「リアルタむムで倧量のデヌタを蚈算および凊理するための高性胜で統合された分散むンメモリプラットフォヌム」ずしお䜍眮付けられおいるこずを知ったため、ずりわけ、プロゞェクトを自動的に展開する機胜を備えおいたす耇雑なトポロゞヌのすべおのノヌド、あなたは圌を知りたいず思うでしょう。 そのような欲求を経隓した埌、Igniteの文曞化はそれほどひどくなく、あたりよくないこずがわかりたす。 チュヌトリアル 、いく぀かのjavadocがありたすが、これらの゜ヌスに粟通するずいう完党で党䜓的な印象は生じたせん。 この蚘事では、䞻にデバッグによっお埗られたIgniteに぀いおの私自身の知識に基づいお、このギャップを埋めようずしたす。 おそらく私の結論ず印象においお、私は垞に正しいずは限りたせんが、これらは方法のコストです。 読者や私の道を繰り返したい人、぀たりJava 8コア、マルチスレッド、Springコアの知識はあたり必芁ありたせん。



この技術を䜿甚したクラス「Hello World」の䟋は、この蚘事で怜蚎および準備されたす。



むンストヌルず起動



この蚘事の執筆時点でのIgniteの最新バヌゞョンは1.7.0であり、調査䞭ですただし、GitHubには既に1.8.0-SNAPSHOTがありたす。 Igniteを取埗するには2぀の方法がありたす。 最初に、Maven䟝存関係をorg.apache.igniteignite-core; LATESTに远加し、オプションでorg.apache.igniteignite-springLATESTにアプリケヌションに远加したす。 補造元のWebサむトからアセンブルされたリリヌスをダりンロヌドするこずもできたす。このWebサむトは 、䞻にMavenが接続するラむブラリたたはDockerむメヌゞで構成されおいたす。 私はWindows 7で調査を行っおいるため、Dockerオプションは利甚できず、バむナリディストリビュヌションをダりンロヌドしたした。 ダりンロヌドしお解凍する必芁がありたす。解凍したフォルダヌはIGNITE_HOMEず呌ばれたす。 さらに、私は通垞、元のチュヌトリアルのプレれンテヌションの順序に埓いたすが、堎合によっおは必然的にそれを堎所で耇補したすが、読者の䟿宜のためだけです。



たず、Igniteトポロゞは、クラむアントずサヌバヌの2皮類のノヌドで構成されおいるこずに泚意しおください。 通垞、負荷はサヌバヌで実行され、匱いマシンで実行されおいるクラむアントはサヌバヌに接続しおタスクを開始したす。 クラむアントノヌドずサヌバヌノヌドは同じJVM内で起動できたすが、ほずんどの堎合、ノヌドはJVM 1に属したす1。 1぀の物理たたは仮想マシンで、任意の数のノヌドを実行できたす。 次に、この違いをより深く分析したす。 この甚語では、「Hello World」アプリケヌションは、サヌバヌず、その有名なメッセヌゞをサヌバヌに送信するクラむアントで構成されたす。



Igniteノヌドを取埗するには、ナヌティリティクラスIgnitionが䜿甚されたす。 倚くのメ゜ッドのうち、5぀のオヌバヌロヌドされた開始メ゜ッドに匕き続き関心がありたす。 そのうちの1぀はパラメヌタヌなしで、デフォルトのパラメヌタヌでノヌドを起動したすが、私たちには適しおいたせん。 2番目は、 入力ずしおIgniteConfigurationタむプの生成された構成オブゞェクトを受け取り、他の3぀は、xml構成を持぀リ゜ヌスぞのパスの圢匏、xml構成ぞのURL、たたはInputStreamの圢匏で、同じIgniteConfigurationオブゞェクトを蚘述するスプリング構成ファむルを受け取りたす。 個人的な経隓から、 新しい IgniteConfigurationを䜿甚しお手動構成でオプションを䜿甚するこずはお勧めしたせん。 実際、IgniteConfigurationオブゞェクトは耇合であり、初期化する必芁があるネストされたオブゞェクトが倚数ありたす。 たた、䞀郚のクラスにはプラむベヌトフィヌルドが含たれおおり、むンゞェクションによっお排他的に初期化されるため、ここではキャッチを非衚瀺にできたす。 たずえば、 TcpDiscoveryJdbcIpFinderクラスでは、ロガヌがこの方法で挿入されたす。 ご存知のように、 新しいむンゞェクションを介しおオブゞェクトを䜜成するずきは発生せず、ロガヌは初期化されずに残りたす。これは明らかに、䞍適切な瞬間にNullPointerExceptionを匕き起こしたす。 したがっお、奜みに関係なく、xml構成を蚘述しお䜿甚する方が安党です。 この構成は、コマンドラむンからIgniteを起動するために䜿甚できるため、このオプションも適しおいたす。 kofigの䟋は、ディストリビュヌションのフォルダヌ$ {IGNITE_HOME} \ examples \ config \にありたす。 最も単玔な構成を以䞋に瀺したす。



クラむアント蚭定
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="gridName" value="testGrid-client"/> <property name="clientMode" value="true"/> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="addresses"> <list> <value>127.0.0.1:47500..47509</value> </list> </property> </bean> </property> <property name="localAddress" value="localhost"/> </bean> </property> <property name="communicationSpi"> <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi"> <property name="localAddress" value="localhost"/> </bean> </property> </bean> </beans>
      
      







ここでは、「testGrid-client」ずいう名前のノヌドを䜜成し、それがクラむアントであり、アドレス範囲127.0.0.1:47500..47509、぀たりロヌカルでサヌバヌを怜玢するず蚀いたす。 サヌバヌに察しお、同様の構成を準備したす。



サヌバヌ構成
 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="gridName" value="testGrid-server"/> <property name="clientMode" value="false"/> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="addresses"> <list> <value>127.0.0.1:47500..47509</value> </list> </property> </bean> </property> <property name="localAddress" value="localhost"/> </bean> </property> <property name="communicationSpi"> <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi"> <property name="localAddress" value="localhost"/> </bean> </property> </bean> </beans>
      
      







サヌバヌ構成をtest.xmlファむルに保存し、$ {IGNITE_HOME} \ examples \ configに配眮したす。 サヌバヌを起動するには、$ {IGNITE_HOME} \ binフォルダヌに移動し、ignite。Bat | shexamples \ config \ test.xmlコマンドを実行したす。 詊隓が行われない堎合、構成は有効であり、最埌に次のようなものが衚瀺されたす。







実行されたバッチファむルは、孊習に圹立ちたす。 JVM倉数を蚭定する暙準機胜に加えお、ロギングの詳现を制埡するIGNITE_QUIETシステム倉数の存圚に぀いお孊習できたす。 システム倉数の完党なリストは、埩号化機胜を備えたIgniteSystemPropertiesクラスで提䟛されたす。 慣れるのは理にかなっおいたすIgniteは新しいバヌゞョンの倖芳をチェックする方法さえ知っおいるこずがわかりたす。 次に、 CommandLineStartupクラスがコマンドラむンから開始する圹割を確認したす。 圌も興味がないわけではありたせん。 OSXで䜜業しおいる堎合は、開始時にポップアップりィンドりがポップアップするこずがわかりたす。 些现なこずだが、気持が良くない-なぜそれが圌らにずっお幞犏なのか おもしろいこずから、パラメヌタヌなしでこのクラスに入るず、むンタラクティブモヌドがオンになり、GridConfigurationFinderが怜出する利甚可胜な構成の遞択肢が提䟛されるこずが明らかです。 圌は$ {IGNITE_HOME}で怜玢できたす。 バッチファむルを介しおパラメヌタなしでは開始できないため、このオプションはここでは䜿甚できたせん。 ただし、コマンド$ {IGNITE_HOME} \ bin \ ignitevisorcmd.batを実行できたす。これはIgniteのむンタラクティブな監芖であり、その䞭でopenコマンドを実行するず、次のようなものが衚瀺されたす。







ここで、構成を指定できたす。このリストでは、番号6の䞋にありたす。6を入力した埌、サヌバヌに接続し、







次に、コン゜ヌルでtopコマンドを入力しお、トポロゞを確認できたす。







深く芋る



CommandLineStartupクラスに戻るず、Scalaで気に入っおいるクラスの゚むリアスに憧れおいる開発者を芋぀けるこずができたす。簡朔にするために、Ignitionクラスの空の子孫であるクラスGを䜜成したした。 さお、サヌバヌを起動したした、次は䜕ですか 次に、クラむアントを実行したす。 むンスタンスを実行する䞀般的なコヌドは次のようになりたす。



ノヌド構成
 @Configuration public class IgniteProvider { private Log log = LogFactory.getLog(IgniteCacheAdapter.class); private final Ignite ignite; private boolean started = false; public IgniteProvider() { try { Ignition.ignite("testGrid-client"); started = true; } catch (IgniteIllegalStateException e) { log.debug("Using the Ignite instance that has been already started."); } if (started) ignite = Ignition.ignite("testGrid-client"); else { ignite = Ignition.start("ignite/example-hello.xml"); ((TcpDiscoverySpi) ignite.configuration().getDiscoverySpi()) .getIpFinder() .registerAddresses(Collections.singletonList(new InetSocketAddress("localhost", DFLT_PORT))); } } public Ignite getIgnite() { return ignite; } }
      
      







ここでは、同じ名前のノヌドがこのJVMで既に実行されおいるかどうかを確認したす。実行されおいる堎合、java.util.concurrent.ConcurrentHashMapではなく、誰かが考えおいるように、組織に保存されたす。 jsr166.ConcurrentHashMap8。 それらの違いは䜕ですか私は掚枬するこずさえ恐れおいたす、コメントの誰かが啓発するこずを望みたす。 たた、ノヌドがただない堎合は、構成に基づいお䜜成されたす。 クラむアントずしお接続しおいるため、サヌバヌを芋぀ける必芁がありたす。 TcpDiscoverySpiおよびTcpDiscoveryMulticastIpFinderは、構成内の怜出メ゜ッドずしお指定され、これらのクラスは初期化され、怜玢操䜜を実行したす。 䞻なものは次のずおりです。



ガむドラむンに埓っお、 TcpDiscoveryImplむンタヌフェヌスの2぀の実装間の遞択はClientImplを優先しお行われたす。 次に、ssl構成が指定されおいる堎合、sslコンテキストが発生したす-゜ケットを䜜成するのに圹立ちたす。 TcpDiscoverySpiオブゞェクトが自身を識別するこずは非垞に重芁です。このため、configでlocalAddressプロパティを蚭定したす。 むンストヌルしない堎合、org.apache.ignite.spi.IgniteSpiExceptionロヌカルホストをアドレスに解決できたせんでした0.0.0.0/0.0.0.0次に、内郚自己蚺断のために、MBeanが登録されたす。補品の監芖。 次に、spiStartメ゜ッドで、遞択した実装が開始されたす。 クラむアントずサヌバヌの䞡方がトポロゞに接続する必芁がありたすが、接続が確立されるたでクラむアントはブロックされたす。 構成では、localhostのポヌトの範囲を指定し、各ポヌトはIgniteが解決しようずしおいたす。 クラむアントは、これらの各ポヌトアドレスにjoinRequestを送信したす。 この堎所では、゜ケットを介しおのみ盞互䜜甚が可胜であり、たずえば、JMSに基づいたトポロゞヌを構築するこずは䞍可胜であるため、私は個人的に倱望したした。 それは残念です。 ただし、Igniteのデフォルトポヌトであるポヌト47500でサヌバヌをチェックしたした。 応答ずしお、最初のハヌスビヌトサヌバヌを取埗し、それに基づいお、察応する蚺断メトリックを曎新したす。 将来、サヌバヌを芋぀けおハヌスビヌトを受信するこのプロセスは継続的に発生したす。 バむザヌに戻り、トポロゞの状態に぀いお尋ねるず、答えは期埅を満たしたす。







サヌバヌコン゜ヌルの出力に泚意しおください。



[15:36:11]トポロゞスナップショット[バヌゞョン= 7、サヌバヌ= 1、クラむアント= 1、CPU = 8、ヒヌプ= 7.1GB]

[15:37:11]トポロゞスナップショット[バヌゞョン= 8、サヌバヌ= 1、クラむアント= 0、CPU = 8、ヒヌプ= 3.6GB]

[15:42:15]トポロゞスナップショット[ver = 9、サヌバヌ= 1、クラむアント= 1、CPU = 8、ヒヌプ= 7.1GB]

[15:42:24]トポロゞスナップショット[バヌゞョン= 10、サヌバヌ= 1、クラむアント= 0、CPU = 8、ヒヌプ= 3.6GB]



ある時点でクラむアントが接続し、その埌萜ちたこずがわかりたす-これは、デバッグ䞭で、タむムアりトによっお萜ちたためです。 玠晎らしい。 今、あなたは䞖界に挚拶するこずができたす。 このガむドでは、ビュヌコヌドの䜿甚を掚奚しおいたす



Junitテスト
 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {IgniteProvider.class}) public class IgniteHelloWorld { @Autowired private IgniteProvider igniteProvider; @Test public void sendHelloTest() { Ignite ignite = igniteProvider.getIgnite(); while(true) { try { ignite.compute().broadcast(() -> System.out.println("Hello World!")); Thread.sleep(1000); } catch (Exception ex) {} } } }
      
      







圌は䜕をしおいたすか igniteオブゞェクトはノヌドを衚したす。 クラむアントのcomputeメ゜ッドは、トポロゞヌに関する知識に埓い、その接続を考慮しお、分散コンピュヌティングのオブゞェクトを䜜成したす。 ブロヌドキャストメ゜ッドは、System.out.printlnコマンド "Hello World"から構築したゞョブを非同期的に実行したす。 私たちが埗る結果は非垞に予想倖です



予期しない䟋倖
 Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException: ru.kmorozov.ignite.test.IgniteHelloWorld at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:671) at org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1454) at org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1392) at org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:369) at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:828) at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read(BinaryFieldAccessor.java:639) at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:776) at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1481) at org.apache.ignite.internal.binary.BinaryUtils.doReadObject(BinaryUtils.java:1608) at org.apache.ignite.internal.binary.BinaryReaderExImpl.readObject(BinaryReaderExImpl.java:1123) at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2V2.readBinary(GridClosureProcessor.java:2023) at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:766) at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1481) at org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:298) at org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal(BinaryMarshaller.java:109) at org.apache.ignite.internal.processors.job.GridJobWorker.initialize(GridJobWorker.java:409) ... 9 more Caused by: java.lang.ClassNotFoundException: ru.kmorozov.ignite.test.IgniteHelloWorld at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8350) at org.apache.ignite.internal.MarshallerContextAdapter.getClass(MarshallerContextAdapter.java:185) at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:662) ... 24 more
      
      







サヌバヌ偎でこれず同じ操䜜を行いたす。 これは私たちが望むものずはたったく異なりたす。 これは、機胜の驚くべき急募配、P2Pクラスの読み蟌み、たたはれロ展開を含めなかったために発生したした。 この点は本物のガむドで説明されおいるので、繰り返したせん。 ポむントは、すべおのクラスずラムダクロヌゞャヌもすべおのノヌドに䌝播する必芁があるずいうこずです。 別の方法は、クラスjarを$ {IGNITE_HOME} \ libsフォルダヌに添付するこずです。 ただし、構成に行を远加しお機胜を有効にしたす



 <property name="peerClassLoadingEnabled" value="true"/>
      
      





倉曎を加え、サヌバヌを再起動したす。 そしお也杯



[16:21:11]トポロゞスナップショット[バヌゞョン= 6、サヌバヌ= 1、クラむアント= 0、CPU = 8、ヒヌプ= 3.6GB]

[16:21:48]トポロゞスナップショット[ver = 7、サヌバヌ= 1、クラむアント= 1、CPU = 8、ヒヌプ= 7.1GB]

Hello World

Hello World

Hello World



結論



予枬可胜な方法で、単玔な䟋では、深byだけでなく興味深い詳现も明らかにしたした。 次のシリヌズでそれらに぀いお話すこずは可胜だず思いたす。Igniteのその他の機胜はただ圱響を受けおいたせん。



参照資料



GitHubテストケヌスコヌド



All Articles