======================== Direct I/O sequence file ======================== ã“ã®æ–‡æ›¸ã§ã¯ã€Direct I/Oã‹ã‚‰Hadoopã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’インãƒãƒ¼ãƒˆ/エクスãƒãƒ¼ãƒˆã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ シーケンスファイル形å¼ã®DataFormatã®ä½œæˆ ======================================== Hadoopã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ« [#]_ を直接èªã¿æ›¸ãã™ã‚‹ã«ã¯ã€ ``SequenceFileFormat`` [#]_ ã®ã‚µãƒ–クラスを作æˆã—ã¾ã™ã€‚ .. hint:: 以é™ã®è¨˜è¿°ã¯ã€Asakusa Frameworkã®å¤–部ã§ä½œæˆã•ã‚ŒãŸã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’利用ã™ã‚‹éš›ã®æ–¹æ³•ã§ã™ã€‚ シーケンスファイルã«Asakusa Frameworkã®ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«å½¢å¼ã‚’直接利用ã™ã‚‹å ´åˆ `内部データ形å¼ã‚’利用ã—ãŸã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã®DataFormatã®ä½œæˆ`_ ãªã©ã‚‚利用å¯èƒ½ã§ã™ã€‚ ``SequenceFileFormat`` 㯠``HadoopFileFormat`` ã®ã‚µãƒ–クラスã§ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’èªã¿æ›¸ãã™ã‚‹ãŸã‚ã®éª¨æ ¼å®Ÿè£…ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™ã€‚ ã“ã®ã‚¯ãƒ©ã‚¹ã‚’継承ã™ã‚‹éš›ã«ã¯ã€ä»¥ä¸‹ã®åž‹å¼•æ•°ã‚’ ``SequenceFileFormat<K, V, T>`` ã«ãã‚Œãžã‚ŒæŒ‡å®šã—ã¦ãã ã•ã„。 ``K`` 対象シーケンスファイルã®ã‚ーオブジェクトã®åž‹ ``V`` 対象シーケンスファイルã®å€¤ã‚ªãƒ–ジェクトã®åž‹ ``T`` アプリケーションã§åˆ©ç”¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã‚ªãƒ–ジェクトã®åž‹ ã“ã®ã‚¯ãƒ©ã‚¹ã§ã¯ã€ä¸‹è¨˜ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¾ã™ã€‚ ``Class<T> getSupportedType()`` 対象ã¨ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã®ã‚¯ãƒ©ã‚¹ã‚’戻り値ã«æŒ‡å®šã—ã¾ã™ã€‚ ``K createKeyObject()`` 対象ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚ーã¨åŒã˜ã‚¯ãƒ©ã‚¹ã®ã‚ªãƒ–ジェクトを戻り値ã«æŒ‡å®šã—ã¾ã™ã€‚ ``V createValueObject()`` 対象ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã®å€¤ã¨åŒã˜ã‚¯ãƒ©ã‚¹ã®ã‚ªãƒ–ジェクトを戻り値ã«æŒ‡å®šã—ã¾ã™ã€‚ ``void copyToModel(K key, V value, T model)`` シーケンスファイルã‹ã‚‰èªã¿å‡ºã—ãŸã‚ー ( ``key`` ) 㨠値 ( ``value`` ) ã®å†…容を〠対象ã®ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã‚ªãƒ–ジェクト ( ``model`` ) ã«è¨å®šã—ã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿èªã¿å‡ºã™éš›ã«ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã”ã¨ã«èµ·å‹•ã•ã‚Œã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã‚ˆã£ã¦å¤‰æ›´ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã‚ªãƒ–ジェクトã¯ã€ä»¥é™ã®å‡¦ç†ã®å…¥åŠ›ã¨ã—ã¦åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚ ``void copyFromModel(T model, K key, V value)`` çµæžœã‚’表ã™ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã‚ªãƒ–ジェクトã®å†…容をã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚ー ( ``key`` ) ã¨å€¤ ( ``value`` ) ã«è¨å®šã—ã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã«ãƒ‡ãƒ¼ã‚¿ã‚’書ã込む際ã«ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã”ã¨ã«èµ·å‹•ã•ã‚Œã¾ã™ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã‚ˆã£ã¦å¤‰æ›´ã•ã‚ŒãŸã‚ーã¨å€¤ãŒãã®ã¾ã¾ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã•ã‚Œã¾ã™ã€‚ ``CompressionCodec getCompressionCodec(Path path)`` シーケンスファイルã®ä½œæˆæ™‚ã«åˆ©ç”¨ã™ã‚‹åœ§ç¸®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã‚’指定ã—ã¾ã™ã€‚ オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ãªã„å ´åˆã€å…¨ä½“ã®è¨å®šæƒ…å ±ã‚’ã‚‚ã¨ã«åœ§ç¸®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã‚’決定ã—ã¾ã™ã€‚ 詳ã—ã㯠`シーケンスファイルã®åœ§ç¸®`_ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 以下ã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã®DataFormatã®å®Ÿè£…例ã§ã™ã€‚ .. code-block:: java public class ExampleSequenceFormat extends SequenceFileFormat<LongWritable, Text, MyData> { @Override public Class<MyData> getSupportedType() { return MyData.class; } @Override protected LongWritable createKeyObject() { return new LongWritable(); } @Override protected Text createValueObject() { return new Text(); } @Override protected void copyToModel(LongWritable key, Text value, MyData model) { model.setPosition(key.get()); model.setText(value); } @Override protected void copyFromModel(MyData model, LongWritable key, Text value) { key.set(model.getPositionOption().or(0L)); value.set(model.getTextOption().or("(null)")); } } .. hint:: ã“ã®æ©Ÿèƒ½ã¯ã€ `Apache Sqoop`_ ç‰ã®ãƒ„ールã¨é€£æºã™ã‚‹ã“ã¨ã‚’想定ã—ã¦æä¾›ã•ã‚Œã¦ã„ã¾ã™ã€‚ .. [#] ``org.apache.hadoop.io.SequenceFile`` .. [#] :asakusafw-javadoc:`com.asakusafw.runtime.directio.hadoop.SequenceFileFormat` .. _`Apache Sqoop` : http://sqoop.apache.org/ シーケンスファイルã®åœ§ç¸® ------------------------ ``SequenceFileFormat`` を利用ã—ã¦ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã™ã‚‹å ´åˆã€ä»¥ä¸‹ã®ã„ãã¤ã‹ã®æ–¹æ³•ã§åœ§ç¸®å½¢å¼ã‚’指定ã§ãã¾ã™ã€‚ 以下ã€ä¸Šã‹ã‚‰é †ã«è©²å½“ã™ã‚‹é …ç›®ãŒã‚ã‚Œã°ã€ãã“ã§è¨å®šã•ã‚ŒãŸåœ§ç¸®å½¢å¼ã‚’利用ã—ã¾ã™ã€‚ ``SequenceFileFormat.getCompressionCodec(Path path)`` をオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ãŒè¿”ã™åœ§ç¸®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã‚’利用ã—ã¾ã™ã€‚ ``null`` を指定ã—ãŸå ´åˆã€åœ§ç¸®ã¯è¡Œã‚ã‚Œã¾ã›ã‚“。 è¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã§ ``com.asakusafw.output.sequencefile.compression.codec`` を指定 上記ã®è¨å®šå€¤ã« ``CompressionCodec`` [#]_ を実装ã—ãŸã‚¯ãƒ©ã‚¹åを指定ã™ã‚‹ã¨ã€ãã®åœ§ç¸®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã‚’利用ã—ã¾ã™ã€‚ ãªãŠã€åˆ©ç”¨ã™ã‚‹åœ§ç¸®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã¯ã‚らã‹ã˜ã‚Hadoopクラスターã®å…¨å°ã«å°Žå…¥ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 上記ã„ãšã‚Œã®æŒ‡å®šã‚‚ãªã„å ´åˆã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã®åœ§ç¸®ã‚’è¡Œã„ã¾ã›ã‚“。 .. note:: 上記ã®è¨å®šã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ä½œæˆæ™‚ã®ã¿æœ‰åŠ¹ã§ã™ã€‚ シーケンスファイルをèªã¿å‡ºã™éš›ã«ã¯ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã®åœ§ç¸®å½¢å¼ã‚’自動的ã«åˆ¤åˆ¥ã—ã¾ã™ã€‚ .. [#] ``org.apache.hadoop.io.compress.CompressionCodec`` 内部データ形å¼ã‚’利用ã—ãŸã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã®DataFormatã®ä½œæˆ ================================================================ シーケンスファイル対ã—ã€Asakusa Frameworkã§åˆ©ç”¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«å½¢å¼ã‚’直接ä¿å˜ã—ãŸã‚Šå¾©å…ƒã—ãŸã‚Šã™ã‚‹ã‚ˆã†ãª ``DataFormat`` ã®å®Ÿè£…クラスを自動的ã«ç”Ÿæˆã™ã‚‹ã«ã¯ã€å¯¾è±¡ã®ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã« ``@directio.sequence_file`` を指定ã—ã¾ã™ã€‚ .. code-block:: dmdl @directio.sequence_file document = { "the name of this document" name : TEXT; "the content of this document" content : TEXT; }; 上記ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã‚¯ãƒ©ã‚¹ã‚’生æˆã™ã‚‹ã¨ã€ ``<出力先パッケージ>.sequencefile.<データモデルå>SequenceFileFormat`` ã¨ã„ã†ã‚¯ãƒ©ã‚¹ãŒè‡ªå‹•ç”Ÿæˆã•ã‚Œã¾ã™ã€‚ ã“ã®ã‚¯ãƒ©ã‚¹ã¯ ``DataFormat`` を実装ã—ã€å¯¾è±¡ã®ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã‚ªãƒ–ジェクトをHadoopã®ç›´åˆ—化機構を直接利用ã—ãŸã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å–り扱ãˆã¾ã™ã€‚ ã¾ãŸã€ å˜ç´”㪠:ref:`directio-dsl-input-description` 㨠:ref:`directio-dsl-output-description` ã®éª¨æ ¼ã‚‚自動生æˆã—ã¾ã™ã€‚ å‰è€…㯠``<出力先パッケージ>.sequencefile.Abstract<データモデルå>SequenceFileInputDescription`` ã€å¾Œè€…㯠``<出力先パッケージ>.sequencefile.Abstract<データモデルå>SequenceFileOutputDescription`` ã¨ã„ã†ã‚¯ãƒ©ã‚¹åã§ç”Ÿæˆã—ã¾ã™ã€‚ å¿…è¦ã«å¿œã˜ã¦ç¶™æ‰¿ã—ã¦åˆ©ç”¨ã—ã¦ãã ã•ã„。 .. attention:: シーケンスファイルã®å½¢å¼ã‚„ã€å†…部データã®ãƒã‚¤ãƒŠãƒªè¡¨ç¾ã¯Hadoopã‚„Asakusa Frameworkã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¢ãƒƒãƒ—ã®éš›ã«å¤‰æ›´ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ データを長期ã«ã‚ãŸã£ã¦ä¿ç®¡ã™ã‚‹å ´åˆã€CSVãªã©ã®ãƒãƒ¼ã‚¿ãƒ–ルãªå½¢å¼ã‚’利用ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ .. hint:: ã“ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã«ã¯ã€DMDLコンパイラã®ãƒ—ラグイン㫠``asakusa-directio-dmdl`` ã‚’è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€ :doc:`../application/gradle-plugin` ã®æ‰‹é †ã«å¾“ã£ã¦ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ†ãƒ³ãƒ—レートã‹ã‚‰ä½œæˆã—ãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¯ã€ã“れらã®ãƒ©ã‚¤ãƒ–ラリやプラグインãŒGradle Pluginã«ã‚ˆã£ã¦ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§åˆ©ç”¨å¯èƒ½ã«ãªã£ã¦ã„ã¾ã™ã€‚ .. hint:: DMDLã®ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«å®šç¾©ã§ã€åŒä¸€ã®ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ã« ``@directio.csv`` 㨠``@directio.sequence_file`` ã®ä¸¡æ–¹ã‚’指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ .. hint:: シーケンスファイルã®ä¸èº«ã‚’テã‚スト形å¼ã§ç¢ºèªã™ã‚‹å ´åˆã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’利用ã™ã‚‹ã¨ä¾¿åˆ©ã§ã™ã€‚ .. code-block:: sh hadoop fs -libjars "$ASAKUSA_HOME/core/lib/asakusa-runtime-all.jar,$ASAKUSA_HOME/batchapps/<ãƒãƒƒãƒID>/lib/jobflow-<フãƒãƒ¼ID>.jar" -text "<path/to/sequence-file>"