From 17cb1b5ec6befa2cec6704010f459cabed6b51e8 Mon Sep 17 00:00:00 2001 From: chief Date: Sat, 11 Dec 2021 10:45:27 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=B1=BB=E5=9B=BE=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E4=BE=BF=E4=BA=8E=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uct/umlrecog/ClassDiagramRecognizer.java | 82 ++++++++++ .../uct/umlrecog/UMLDiagramRecognizer.java | 149 ++++++------------ 2 files changed, 129 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java index 5af90cf..80006f9 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java @@ -1,6 +1,9 @@ package com.hy.java.uct.umlrecog; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.opencv.core.Core; import org.opencv.core.Mat; @@ -80,6 +83,85 @@ public class ClassDiagramRecognizer { } } + public static void recogT(String cd_dir, String repo_name) { + Map result = new HashMap<>(); + // UML图识别结果 + FileEditor model_file = new FileEditor(cd_dir + repo_name.replaceAll("/", "_") + ".txt"); + model_file.write(model_file.readFileToString(), false); + // 保存类名、属性、方法。类之间以“#”隔开 + String[] class_strs = model_file.readFileToString().split("#"); + for (String class_str : class_strs) { + UMLClass UML_class = new UMLClass(); + // 类名、属性、方法用“@”隔开 + String[] class_info_strs = class_str.split("@"); + // 类名 + if (class_info_strs[0].lastIndexOf(")") + 1 <= class_info_strs[0].length() - 1) { + UML_class.setTitle(class_info_strs[0].substring(class_info_strs[0].lastIndexOf(")") + 1, class_info_strs[0].length() - 1)); + } else { + UML_class.setTitle(class_info_strs[0]); + } + // 属性 + if (class_info_strs[1].length() > 0) { + UML_class.setAttrisStr(class_info_strs[1].substring(0, class_info_strs[1].length() - 1)); + } else { + UML_class.setAttrisStr(class_info_strs[1]); + } + // 方法 + if (class_info_strs.length >= 3) { + if (class_info_strs[2].length() > 0) { + UML_class.setMethodsStr(class_info_strs[2].substring(0, class_info_strs[2].length() - 1)); + } else { + UML_class.setMethodsStr(class_info_strs[2]); + } + } + result.put(UML_class.getTitle(), UML_class); + } + // 根据类名保存关系(出、入两类) + for (String class_str : class_strs) { + String[] class_info_strs = class_str.split("@"); + UMLClass UML_class = null; + if (class_info_strs[0].lastIndexOf(")") + 1 <= class_info_strs[0].length() - 1) { + UML_class = result.get(class_info_strs[0].substring(class_info_strs[0].lastIndexOf(")") + 1, class_info_strs[0].length() - 1)); + } else { + UML_class = result.get(class_info_strs[0]); + } + // 出 + if (class_info_strs.length >= 4) { + if (!class_info_strs[3].isBlank()) { + // 关系用“¥”隔开 + String[] out_relas = class_info_strs[3].split("¥"); + for (String out_rela_str : out_relas) { + ImgRelation relation = new ImgRelation(); + String[] rela_info = out_rela_str.split("%"); + relation.source = result.get(rela_info[0].substring(0, rela_info[0].length() - 1)); + relation.target = result.get(rela_info[1].substring(0, rela_info[1].length() - 1)); + relation.type = rela_info[2]; + UML_class.out_relas.add(relation); + } + } + } + // 入 + if (class_info_strs.length == 5) { + // 关系用“¥”隔开 + String[] in_relas = class_info_strs[4].split("¥"); + for (String in_rela_str : in_relas) { + ImgRelation relation = new ImgRelation(); + String[] rela_info = in_rela_str.split("%"); + relation.source = result.get(rela_info[0].substring(0, rela_info[0].length() - 1)); + relation.target = result.get(rela_info[1].substring(0, rela_info[1].length() - 1)); + relation.type = rela_info[2]; + UML_class.in_relas.add(relation); + } + } + } + Collection classes = result.values(); + for (UMLClass cls : classes) { + System.out.println(cls.getTitle()); + System.out.println(cls.getAttrisStr()); + System.out.println(cls.getMethodsStr()); + } + } + private static String findCD(String cd_dir, String repo_name) { String result = null; // 用repo_name去查找图片时所使用的字符串 diff --git a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java index 30b57e9..937e8c4 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java @@ -24,7 +24,7 @@ public class UMLDiagramRecognizer { if (todo) { ClassDiagramRecognizer.recog(cd_dir, repo_name); } else { - // 校验文件 + ClassDiagramRecognizer.recogT(cd_dir, repo_name); } } @@ -43,110 +43,55 @@ public class UMLDiagramRecognizer { /* * 测试一下识别特定的类图和顺序图 + * + * 是否没有文件 */ public static void main(String[] args) { // 类图实验 - // true的是要识别的 - UMLDiagramRecognizer.recogCD(cd_dir, "abrden/StarCraft", false); - UMLDiagramRecognizer.recogCD(cd_dir, "alexasahis/km2", false); - UMLDiagramRecognizer.recogCD(cd_dir, "BackupTheBerlios/jpwgen-svn", false); - UMLDiagramRecognizer.recogCD(cd_dir, "badqiu/rapid-framework", false); - UMLDiagramRecognizer.recogCD(cd_dir, "bojoer/loadui", false); - UMLDiagramRecognizer.recogCD(cd_dir, "C204-242-DJSMT/Assignment-1", false); - UMLDiagramRecognizer.recogCD(cd_dir, "cscfa/bartleby", false); - UMLDiagramRecognizer.recogCD(cd_dir, "dsarlis/SoftEng", false); - UMLDiagramRecognizer.recogCD(cd_dir, "egoless/pqs", false); - UMLDiagramRecognizer.recogCD(cd_dir, "emeric254/Java-STRI-S4", false); - UMLDiagramRecognizer.recogCD(cd_dir, "bloodmarry12/rapid-framework_googlecode", false); - UMLDiagramRecognizer.recogCD(cd_dir, "rodrigoazevedomartins/TrabalhoFinalLTPIII", true);// - UMLDiagramRecognizer.recogCD(cd_dir, "ultragdb/org.eclipse.cdt", false); - UMLDiagramRecognizer.recogCD(cd_dir, "georgejakes/Xug", false); - UMLDiagramRecognizer.recogCD(cd_dir, "hungnguyen94/BTrouble", false); - UMLDiagramRecognizer.recogCD(cd_dir, "klemens/openolat", false); - UMLDiagramRecognizer.recogCD(cd_dir, "lorneliechty/pleaseholdapplause", true);// - UMLDiagramRecognizer.recogCD(cd_dir, "neuroph/neuroph", false); - UMLDiagramRecognizer.recogCD(cd_dir, "PillowSoPaw/SPSWENG-astroNATS", false); - UMLDiagramRecognizer.recogCD(cd_dir, "tiendan3108/CP", false); - UMLDiagramRecognizer.recogCD(cd_dir, "FantomKnight/AndEngine", false); - UMLDiagramRecognizer.recogCD(cd_dir, "felps/FTFramework", false); - UMLDiagramRecognizer.recogCD(cd_dir, "fltt/jss7", false); - UMLDiagramRecognizer.recogCD(cd_dir, "gemxd/gemfirexd-oss", false); - UMLDiagramRecognizer.recogCD(cd_dir, "ging/isabel", false); - UMLDiagramRecognizer.recogCD(cd_dir, "hangum/TadpoleForDBTools", true);// - UMLDiagramRecognizer.recogCD(cd_dir, "Istarnion/Team12", false); - UMLDiagramRecognizer.recogCD(cd_dir, "jaissegrela/steganography", false); - UMLDiagramRecognizer.recogCD(cd_dir, "jguze/ACiv", false); - UMLDiagramRecognizer.recogCD(cd_dir, "jorgearj/USDLPricing_API", false); - UMLDiagramRecognizer.recogCD(cd_dir, "kauffmj/modificare", false); - UMLDiagramRecognizer.recogCD(cd_dir, "kbarrett/third-year-project", false); - UMLDiagramRecognizer.recogCD(cd_dir, "kuali_rice", false); - UMLDiagramRecognizer.recogCD(cd_dir, "leemdoyun/android-education-project", false); - UMLDiagramRecognizer.recogCD(cd_dir, "luis-alberto/magicBinder", false); - UMLDiagramRecognizer.recogCD(cd_dir, "marcellodesales/my-cs-research", false); - UMLDiagramRecognizer.recogCD(cd_dir, "OBHITA/Consent2Share", false); - UMLDiagramRecognizer.recogCD(cd_dir, "petergodfrey/TradeSimulator", false); - UMLDiagramRecognizer.recogCD(cd_dir, "portmobile/LAGP-Example-Code", false); - UMLDiagramRecognizer.recogCD(cd_dir, "retoo/bodesuri", false); - UMLDiagramRecognizer.recogCD(cd_dir, "richardimms/PRCSA", false); - UMLDiagramRecognizer.recogCD(cd_dir, "rNdm74/Java", false); - UMLDiagramRecognizer.recogCD(cd_dir, "Salaboy/smart-tasks", true);// - UMLDiagramRecognizer.recogCD(cd_dir, "Sanchez82/Crawler", false); - UMLDiagramRecognizer.recogCD(cd_dir, "snucsne/bio-inspired-leadership", true);// - UMLDiagramRecognizer.recogCD(cd_dir, "steyskal/Ren-Fest", false); - UMLDiagramRecognizer.recogCD(cd_dir, "Team-MWSU/GroupProject", false); - UMLDiagramRecognizer.recogCD(cd_dir, "teopalva/travel-dream", false); - UMLDiagramRecognizer.recogCD(cd_dir, "valentinamata/flow3in2013", true);// - UMLDiagramRecognizer.recogCD(cd_dir, "WiReSEP/Rollercoaster2011", false); + UMLDiagramRecognizer.recogCD(cd_dir, "Salaboy/smart-tasks", false); + /* + * UMLDiagramRecognizer.recogCD(cd_dir, "abrden/StarCraft", false); UMLDiagramRecognizer.recogCD(cd_dir, "alexasahis/km2", false); UMLDiagramRecognizer.recogCD(cd_dir, "BackupTheBerlios/jpwgen-svn", + * false); UMLDiagramRecognizer.recogCD(cd_dir, "badqiu/rapid-framework", false); UMLDiagramRecognizer.recogCD(cd_dir, "bojoer/loadui", false); UMLDiagramRecognizer.recogCD(cd_dir, + * "C204-242-DJSMT/Assignment-1", false); UMLDiagramRecognizer.recogCD(cd_dir, "cscfa/bartleby", false); UMLDiagramRecognizer.recogCD(cd_dir, "dsarlis/SoftEng", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "egoless/pqs", false); UMLDiagramRecognizer.recogCD(cd_dir, "emeric254/Java-STRI-S4", false); UMLDiagramRecognizer.recogCD(cd_dir, + * "bloodmarry12/rapid-framework_googlecode", false); UMLDiagramRecognizer.recogCD(cd_dir, "rodrigoazevedomartins/TrabalhoFinalLTPIII", true); UMLDiagramRecognizer.recogCD(cd_dir, + * "ultragdb/org.eclipse.cdt", false); UMLDiagramRecognizer.recogCD(cd_dir, "georgejakes/Xug", false); UMLDiagramRecognizer.recogCD(cd_dir, "hungnguyen94/BTrouble", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "klemens/openolat", false); UMLDiagramRecognizer.recogCD(cd_dir, "lorneliechty/pleaseholdapplause", true); UMLDiagramRecognizer.recogCD(cd_dir, + * "neuroph/neuroph", false); UMLDiagramRecognizer.recogCD(cd_dir, "PillowSoPaw/SPSWENG-astroNATS", false); UMLDiagramRecognizer.recogCD(cd_dir, "tiendan3108/CP", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "FantomKnight/AndEngine", false); UMLDiagramRecognizer.recogCD(cd_dir, "felps/FTFramework", false); UMLDiagramRecognizer.recogCD(cd_dir, "fltt/jss7", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "gemxd/gemfirexd-oss", false); UMLDiagramRecognizer.recogCD(cd_dir, "ging/isabel", false); UMLDiagramRecognizer.recogCD(cd_dir, "hangum/TadpoleForDBTools", + * true); UMLDiagramRecognizer.recogCD(cd_dir, "Istarnion/Team12", false); UMLDiagramRecognizer.recogCD(cd_dir, "jaissegrela/steganography", false); UMLDiagramRecognizer.recogCD(cd_dir, "jguze/ACiv", + * false); UMLDiagramRecognizer.recogCD(cd_dir, "jorgearj/USDLPricing_API", false); UMLDiagramRecognizer.recogCD(cd_dir, "kauffmj/modificare", false); UMLDiagramRecognizer.recogCD(cd_dir, + * "kbarrett/third-year-project", false); UMLDiagramRecognizer.recogCD(cd_dir, "kuali_rice", false); UMLDiagramRecognizer.recogCD(cd_dir, "leemdoyun/android-education-project", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "luis-alberto/magicBinder", false); UMLDiagramRecognizer.recogCD(cd_dir, "marcellodesales/my-cs-research", false); UMLDiagramRecognizer.recogCD(cd_dir, + * "OBHITA/Consent2Share", false); UMLDiagramRecognizer.recogCD(cd_dir, "petergodfrey/TradeSimulator", false); UMLDiagramRecognizer.recogCD(cd_dir, "portmobile/LAGP-Example-Code", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "retoo/bodesuri", false); UMLDiagramRecognizer.recogCD(cd_dir, "richardimms/PRCSA", false); UMLDiagramRecognizer.recogCD(cd_dir, "rNdm74/Java", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "Sanchez82/Crawler", false); UMLDiagramRecognizer.recogCD(cd_dir, "snucsne/bio-inspired-leadership", true); UMLDiagramRecognizer.recogCD(cd_dir, + * "steyskal/Ren-Fest", false); UMLDiagramRecognizer.recogCD(cd_dir, "Team-MWSU/GroupProject", false); UMLDiagramRecognizer.recogCD(cd_dir, "teopalva/travel-dream", false); + * UMLDiagramRecognizer.recogCD(cd_dir, "valentinamata/flow3in2013", true); UMLDiagramRecognizer.recogCD(cd_dir, "WiReSEP/Rollercoaster2011", false); + */ // 顺序图实验 - UMLDiagramRecognizer.recogSD(sd_dir, "laurikin/java-tetris", false); - UMLDiagramRecognizer.recogSD(sd_dir, "abhinava/indic-keyboards", false); - UMLDiagramRecognizer.recogSD(sd_dir, "alessandrocolantoni_mandragora", false); - UMLDiagramRecognizer.recogSD(sd_dir, "camillelabeille/autofocus", false); - UMLDiagramRecognizer.recogSD(sd_dir, "cyrus305/ver_3LibraryManagementSystem_MPP", false); - UMLDiagramRecognizer.recogSD(sd_dir, "dle79/ASD", false); - UMLDiagramRecognizer.recogSD(sd_dir, "dle79/LibraryMgt", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Edwards9489/estatge-agent-system", false); - UMLDiagramRecognizer.recogSD(sd_dir, "freedude/Kildare-to-Discover", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Geo-Fence/Geo-Fence", false); - UMLDiagramRecognizer.recogSD(sd_dir, "inved1/ch.bfh.bti7081.s2013.black", false); - UMLDiagramRecognizer.recogSD(sd_dir, "kevinstier/VossenEnKonijnen", false); - UMLDiagramRecognizer.recogSD(sd_dir, "kviniink/Skripsi", false); - UMLDiagramRecognizer.recogSD(sd_dir, "lordwoo/Degree-Dissertation", false); - UMLDiagramRecognizer.recogSD(sd_dir, "mcsinking/Group1_MPP_PROJECT", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Pulperi/MLG-360-NOSCOPE-SUDOKU-SOLVER", false); - UMLDiagramRecognizer.recogSD(sd_dir, "tearvan/SkripsiKIRIDataMining", false); - UMLDiagramRecognizer.recogSD(sd_dir, "waisuan/undergraduate", false); - UMLDiagramRecognizer.recogSD(sd_dir, "ws23/IndependentStudy", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Xpitfire/ufo", false); - UMLDiagramRecognizer.recogSD(sd_dir, "3873757/Software-Engineering", false); - UMLDiagramRecognizer.recogSD(sd_dir, "adeboni/blackboard-cryptanalysis", false); - UMLDiagramRecognizer.recogSD(sd_dir, "albanoj2/grp", false); - UMLDiagramRecognizer.recogSD(sd_dir, "AlinNereid/searchable-encryption", false); - UMLDiagramRecognizer.recogSD(sd_dir, "BackupTheBerlios/visidia-svn", false); - UMLDiagramRecognizer.recogSD(sd_dir, "benlau/quickandroid", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Blodir/Stackallax", false); - UMLDiagramRecognizer.recogSD(sd_dir, "chamhayden/COMP2911-ASS1", false); - UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W14T12/GeoChan", false); - UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W15T02_TeamTo", false); - UMLDiagramRecognizer.recogSD(sd_dir, "coinvent/coinvent", false); - UMLDiagramRecognizer.recogSD(sd_dir, "cs2103jan2015-w13-4j/main", false); - UMLDiagramRecognizer.recogSD(sd_dir, "gelosie/jdic", false); - UMLDiagramRecognizer.recogSD(sd_dir, "GiorgosMethe/PredatorVsPrey", false); - UMLDiagramRecognizer.recogSD(sd_dir, "GitIgitt/SE1415", false); - UMLDiagramRecognizer.recogSD(sd_dir, "him229/the-gold-hunters", false); - UMLDiagramRecognizer.recogSD(sd_dir, "jonatasdaniel/tcc", false); - UMLDiagramRecognizer.recogSD(sd_dir, "ktisha/archive", false); - UMLDiagramRecognizer.recogSD(sd_dir, "lemmy/SecuredSLP", false); - UMLDiagramRecognizer.recogSD(sd_dir, "leschman/Coursework", false); - UMLDiagramRecognizer.recogSD(sd_dir, "pekim/node-jdbc", false); - UMLDiagramRecognizer.recogSD(sd_dir, "plcortesc/VIN", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Richard-Dang/tetristry-game", false); - UMLDiagramRecognizer.recogSD(sd_dir, "seeburger-ag/jbossts", false); - UMLDiagramRecognizer.recogSD(sd_dir, "spectrenoir06/ProjectS2_Ring", false); - UMLDiagramRecognizer.recogSD(sd_dir, "SpoonLabs/astor", false); - UMLDiagramRecognizer.recogSD(sd_dir, "timfel/meet4xmas", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Vskilet/eduram", false); - UMLDiagramRecognizer.recogSD(sd_dir, "Rautiainen/Starmap", false); - UMLDiagramRecognizer.recogSD(sd_dir, "zy084232/Knowing-Campus", false); + /* + * UMLDiagramRecognizer.recogSD(sd_dir, "laurikin/java-tetris", false); UMLDiagramRecognizer.recogSD(sd_dir, "abhinava/indic-keyboards", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "alessandrocolantoni_mandragora", false); UMLDiagramRecognizer.recogSD(sd_dir, "camillelabeille/autofocus", false); UMLDiagramRecognizer.recogSD(sd_dir, "cyrus305/ver_3LibraryManagementSystem_MPP", + * false); UMLDiagramRecognizer.recogSD(sd_dir, "dle79/ASD", false); UMLDiagramRecognizer.recogSD(sd_dir, "dle79/LibraryMgt", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "Edwards9489/estatge-agent-system", false); UMLDiagramRecognizer.recogSD(sd_dir, "freedude/Kildare-to-Discover", false); UMLDiagramRecognizer.recogSD(sd_dir, "Geo-Fence/Geo-Fence", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "inved1/ch.bfh.bti7081.s2013.black", false); UMLDiagramRecognizer.recogSD(sd_dir, "kevinstier/VossenEnKonijnen", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "kviniink/Skripsi", false); UMLDiagramRecognizer.recogSD(sd_dir, "lordwoo/Degree-Dissertation", false); UMLDiagramRecognizer.recogSD(sd_dir, "mcsinking/Group1_MPP_PROJECT", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "Pulperi/MLG-360-NOSCOPE-SUDOKU-SOLVER", false); UMLDiagramRecognizer.recogSD(sd_dir, "tearvan/SkripsiKIRIDataMining", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "waisuan/undergraduate", false); UMLDiagramRecognizer.recogSD(sd_dir, "ws23/IndependentStudy", false); UMLDiagramRecognizer.recogSD(sd_dir, "Xpitfire/ufo", + * false); UMLDiagramRecognizer.recogSD(sd_dir, "3873757/Software-Engineering", false); UMLDiagramRecognizer.recogSD(sd_dir, "adeboni/blackboard-cryptanalysis", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "albanoj2/grp", false); UMLDiagramRecognizer.recogSD(sd_dir, "AlinNereid/searchable-encryption", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "BackupTheBerlios/visidia-svn", false); UMLDiagramRecognizer.recogSD(sd_dir, "benlau/quickandroid", false); UMLDiagramRecognizer.recogSD(sd_dir, "Blodir/Stackallax", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "chamhayden/COMP2911-ASS1", false); UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W14T12/GeoChan", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "CMPUT301W15T02_TeamTo", false); UMLDiagramRecognizer.recogSD(sd_dir, "coinvent/coinvent", false); UMLDiagramRecognizer.recogSD(sd_dir, "cs2103jan2015-w13-4j/main", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "gelosie/jdic", false); UMLDiagramRecognizer.recogSD(sd_dir, "GiorgosMethe/PredatorVsPrey", false); UMLDiagramRecognizer.recogSD(sd_dir, "GitIgitt/SE1415", + * false); UMLDiagramRecognizer.recogSD(sd_dir, "him229/the-gold-hunters", false); UMLDiagramRecognizer.recogSD(sd_dir, "jonatasdaniel/tcc", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "ktisha/archive", false); UMLDiagramRecognizer.recogSD(sd_dir, "lemmy/SecuredSLP", false); UMLDiagramRecognizer.recogSD(sd_dir, "leschman/Coursework", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "pekim/node-jdbc", false); UMLDiagramRecognizer.recogSD(sd_dir, "plcortesc/VIN", false); UMLDiagramRecognizer.recogSD(sd_dir, "Richard-Dang/tetristry-game", false); + * UMLDiagramRecognizer.recogSD(sd_dir, "seeburger-ag/jbossts", false); UMLDiagramRecognizer.recogSD(sd_dir, "spectrenoir06/ProjectS2_Ring", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "SpoonLabs/astor", false); UMLDiagramRecognizer.recogSD(sd_dir, "timfel/meet4xmas", false); UMLDiagramRecognizer.recogSD(sd_dir, "Vskilet/eduram", false); UMLDiagramRecognizer.recogSD(sd_dir, + * "Rautiainen/Starmap", false); UMLDiagramRecognizer.recogSD(sd_dir, "zy084232/Knowing-Campus", false); + */ } } -- Gitee From a52cb5fba487026da33d1d4f9acf02dcea045665 Mon Sep 17 00:00:00 2001 From: chief Date: Sat, 11 Dec 2021 11:00:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=87=86=E5=A4=87=E5=81=9A=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E5=9B=BE=E8=BF=BD=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hy/java/uct/sdtocode/SDToCodeTracer.java | 9 ++ .../uct/umlrecog/ClassDiagramRecognizer.java | 22 +++ .../uct/umlrecog/UMLDiagramRecognizer.java | 144 ++++++++++++------ .../resources/cd/jorgearj_USDLPricing_API.txt | 14 +- src/main/resources/cd/temp result.png | Bin 3502 -> 11778 bytes 5 files changed, 138 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java diff --git a/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java b/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java new file mode 100644 index 0000000..16b1dfd --- /dev/null +++ b/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java @@ -0,0 +1,9 @@ +package com.hy.java.uct.sdtocode; + +public class SDToCodeTracer { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java index 80006f9..7571537 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java @@ -84,6 +84,28 @@ public class ClassDiagramRecognizer { } public static void recogT(String cd_dir, String repo_name) { + // 遍历cd_dir下的文件,寻找repo_name对应的图片,存在repo_cd_path中 + String repo_cd_path = findCD(cd_dir, repo_name); + if (repo_cd_path != null) { + // 导入OpenCV库,开始识别 + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + /* + * 识别类图中的类 + */ + ClassDetector cls_detector = new ClassDetector(repo_cd_path); + cls_detector.recog(); + Pair> classes = cls_detector.getResult(); + /* + * 识别类图中的关系 + */ + ClassRelationDetector cls_relation_detector = new ClassRelationDetector(repo_cd_path, classes); + cls_relation_detector.recog(); + Pair> classes_with_relations = cls_relation_detector.getResult(); + List class_list = classes_with_relations.getRight(); + for (UMLClass UML_class : class_list) { + System.out.println(UML_class + " done"); + } + } Map result = new HashMap<>(); // UML图识别结果 FileEditor model_file = new FileEditor(cd_dir + repo_name.replaceAll("/", "_") + ".txt"); diff --git a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java index 937e8c4..78cf56c 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java @@ -48,50 +48,106 @@ public class UMLDiagramRecognizer { */ public static void main(String[] args) { // 类图实验 - UMLDiagramRecognizer.recogCD(cd_dir, "Salaboy/smart-tasks", false); - /* - * UMLDiagramRecognizer.recogCD(cd_dir, "abrden/StarCraft", false); UMLDiagramRecognizer.recogCD(cd_dir, "alexasahis/km2", false); UMLDiagramRecognizer.recogCD(cd_dir, "BackupTheBerlios/jpwgen-svn", - * false); UMLDiagramRecognizer.recogCD(cd_dir, "badqiu/rapid-framework", false); UMLDiagramRecognizer.recogCD(cd_dir, "bojoer/loadui", false); UMLDiagramRecognizer.recogCD(cd_dir, - * "C204-242-DJSMT/Assignment-1", false); UMLDiagramRecognizer.recogCD(cd_dir, "cscfa/bartleby", false); UMLDiagramRecognizer.recogCD(cd_dir, "dsarlis/SoftEng", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "egoless/pqs", false); UMLDiagramRecognizer.recogCD(cd_dir, "emeric254/Java-STRI-S4", false); UMLDiagramRecognizer.recogCD(cd_dir, - * "bloodmarry12/rapid-framework_googlecode", false); UMLDiagramRecognizer.recogCD(cd_dir, "rodrigoazevedomartins/TrabalhoFinalLTPIII", true); UMLDiagramRecognizer.recogCD(cd_dir, - * "ultragdb/org.eclipse.cdt", false); UMLDiagramRecognizer.recogCD(cd_dir, "georgejakes/Xug", false); UMLDiagramRecognizer.recogCD(cd_dir, "hungnguyen94/BTrouble", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "klemens/openolat", false); UMLDiagramRecognizer.recogCD(cd_dir, "lorneliechty/pleaseholdapplause", true); UMLDiagramRecognizer.recogCD(cd_dir, - * "neuroph/neuroph", false); UMLDiagramRecognizer.recogCD(cd_dir, "PillowSoPaw/SPSWENG-astroNATS", false); UMLDiagramRecognizer.recogCD(cd_dir, "tiendan3108/CP", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "FantomKnight/AndEngine", false); UMLDiagramRecognizer.recogCD(cd_dir, "felps/FTFramework", false); UMLDiagramRecognizer.recogCD(cd_dir, "fltt/jss7", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "gemxd/gemfirexd-oss", false); UMLDiagramRecognizer.recogCD(cd_dir, "ging/isabel", false); UMLDiagramRecognizer.recogCD(cd_dir, "hangum/TadpoleForDBTools", - * true); UMLDiagramRecognizer.recogCD(cd_dir, "Istarnion/Team12", false); UMLDiagramRecognizer.recogCD(cd_dir, "jaissegrela/steganography", false); UMLDiagramRecognizer.recogCD(cd_dir, "jguze/ACiv", - * false); UMLDiagramRecognizer.recogCD(cd_dir, "jorgearj/USDLPricing_API", false); UMLDiagramRecognizer.recogCD(cd_dir, "kauffmj/modificare", false); UMLDiagramRecognizer.recogCD(cd_dir, - * "kbarrett/third-year-project", false); UMLDiagramRecognizer.recogCD(cd_dir, "kuali_rice", false); UMLDiagramRecognizer.recogCD(cd_dir, "leemdoyun/android-education-project", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "luis-alberto/magicBinder", false); UMLDiagramRecognizer.recogCD(cd_dir, "marcellodesales/my-cs-research", false); UMLDiagramRecognizer.recogCD(cd_dir, - * "OBHITA/Consent2Share", false); UMLDiagramRecognizer.recogCD(cd_dir, "petergodfrey/TradeSimulator", false); UMLDiagramRecognizer.recogCD(cd_dir, "portmobile/LAGP-Example-Code", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "retoo/bodesuri", false); UMLDiagramRecognizer.recogCD(cd_dir, "richardimms/PRCSA", false); UMLDiagramRecognizer.recogCD(cd_dir, "rNdm74/Java", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "Sanchez82/Crawler", false); UMLDiagramRecognizer.recogCD(cd_dir, "snucsne/bio-inspired-leadership", true); UMLDiagramRecognizer.recogCD(cd_dir, - * "steyskal/Ren-Fest", false); UMLDiagramRecognizer.recogCD(cd_dir, "Team-MWSU/GroupProject", false); UMLDiagramRecognizer.recogCD(cd_dir, "teopalva/travel-dream", false); - * UMLDiagramRecognizer.recogCD(cd_dir, "valentinamata/flow3in2013", true); UMLDiagramRecognizer.recogCD(cd_dir, "WiReSEP/Rollercoaster2011", false); - */ + // UMLDiagramRecognizer.recogCD(cd_dir, "Salaboy/smart-tasks", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "abrden/StarCraft", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "alexasahis/km2", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "BackupTheBerlios/jpwgen-svn", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "badqiu/rapid-framework", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "bojoer/loadui", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "C204-242-DJSMT/Assignment-1", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "cscfa/bartleby", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "dsarlis/SoftEng", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "egoless/pqs", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "emeric254/Java-STRI-S4", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "bloodmarry12/rapid-framework_googlecode", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "rodrigoazevedomartins/TrabalhoFinalLTPIII", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "ultragdb/org.eclipse.cdt", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "georgejakes/Xug", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "hungnguyen94/BTrouble", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "klemens/openolat", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "lorneliechty/pleaseholdapplause", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "neuroph/neuroph", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "PillowSoPaw/SPSWENG-astroNATS", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "tiendan3108/CP", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "FantomKnight/AndEngine", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "felps/FTFramework", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "fltt/jss7", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "gemxd/gemfirexd-oss", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "ging/isabel", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "hangum/TadpoleForDBTools", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "Istarnion/Team12", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "jaissegrela/steganography", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "jguze/ACiv", false); + UMLDiagramRecognizer.recogCD(cd_dir, "jorgearj/USDLPricing_API", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "kauffmj/modificare", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "kbarrett/third-year-project", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "kuali_rice", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "leemdoyun/android-education-project", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "luis-alberto/magicBinder", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "marcellodesales/my-cs-research", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "OBHITA/Consent2Share", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "petergodfrey/TradeSimulator", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "portmobile/LAGP-Example-Code", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "retoo/bodesuri", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "richardimms/PRCSA", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "rNdm74/Java", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "Sanchez82/Crawler", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "snucsne/bio-inspired-leadership", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "steyskal/Ren-Fest", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "Team-MWSU/GroupProject", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "teopalva/travel-dream", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "valentinamata/flow3in2013", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "WiReSEP/Rollercoaster2011", false); // 顺序图实验 - /* - * UMLDiagramRecognizer.recogSD(sd_dir, "laurikin/java-tetris", false); UMLDiagramRecognizer.recogSD(sd_dir, "abhinava/indic-keyboards", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "alessandrocolantoni_mandragora", false); UMLDiagramRecognizer.recogSD(sd_dir, "camillelabeille/autofocus", false); UMLDiagramRecognizer.recogSD(sd_dir, "cyrus305/ver_3LibraryManagementSystem_MPP", - * false); UMLDiagramRecognizer.recogSD(sd_dir, "dle79/ASD", false); UMLDiagramRecognizer.recogSD(sd_dir, "dle79/LibraryMgt", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "Edwards9489/estatge-agent-system", false); UMLDiagramRecognizer.recogSD(sd_dir, "freedude/Kildare-to-Discover", false); UMLDiagramRecognizer.recogSD(sd_dir, "Geo-Fence/Geo-Fence", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "inved1/ch.bfh.bti7081.s2013.black", false); UMLDiagramRecognizer.recogSD(sd_dir, "kevinstier/VossenEnKonijnen", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "kviniink/Skripsi", false); UMLDiagramRecognizer.recogSD(sd_dir, "lordwoo/Degree-Dissertation", false); UMLDiagramRecognizer.recogSD(sd_dir, "mcsinking/Group1_MPP_PROJECT", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "Pulperi/MLG-360-NOSCOPE-SUDOKU-SOLVER", false); UMLDiagramRecognizer.recogSD(sd_dir, "tearvan/SkripsiKIRIDataMining", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "waisuan/undergraduate", false); UMLDiagramRecognizer.recogSD(sd_dir, "ws23/IndependentStudy", false); UMLDiagramRecognizer.recogSD(sd_dir, "Xpitfire/ufo", - * false); UMLDiagramRecognizer.recogSD(sd_dir, "3873757/Software-Engineering", false); UMLDiagramRecognizer.recogSD(sd_dir, "adeboni/blackboard-cryptanalysis", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "albanoj2/grp", false); UMLDiagramRecognizer.recogSD(sd_dir, "AlinNereid/searchable-encryption", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "BackupTheBerlios/visidia-svn", false); UMLDiagramRecognizer.recogSD(sd_dir, "benlau/quickandroid", false); UMLDiagramRecognizer.recogSD(sd_dir, "Blodir/Stackallax", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "chamhayden/COMP2911-ASS1", false); UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W14T12/GeoChan", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "CMPUT301W15T02_TeamTo", false); UMLDiagramRecognizer.recogSD(sd_dir, "coinvent/coinvent", false); UMLDiagramRecognizer.recogSD(sd_dir, "cs2103jan2015-w13-4j/main", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "gelosie/jdic", false); UMLDiagramRecognizer.recogSD(sd_dir, "GiorgosMethe/PredatorVsPrey", false); UMLDiagramRecognizer.recogSD(sd_dir, "GitIgitt/SE1415", - * false); UMLDiagramRecognizer.recogSD(sd_dir, "him229/the-gold-hunters", false); UMLDiagramRecognizer.recogSD(sd_dir, "jonatasdaniel/tcc", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "ktisha/archive", false); UMLDiagramRecognizer.recogSD(sd_dir, "lemmy/SecuredSLP", false); UMLDiagramRecognizer.recogSD(sd_dir, "leschman/Coursework", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "pekim/node-jdbc", false); UMLDiagramRecognizer.recogSD(sd_dir, "plcortesc/VIN", false); UMLDiagramRecognizer.recogSD(sd_dir, "Richard-Dang/tetristry-game", false); - * UMLDiagramRecognizer.recogSD(sd_dir, "seeburger-ag/jbossts", false); UMLDiagramRecognizer.recogSD(sd_dir, "spectrenoir06/ProjectS2_Ring", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "SpoonLabs/astor", false); UMLDiagramRecognizer.recogSD(sd_dir, "timfel/meet4xmas", false); UMLDiagramRecognizer.recogSD(sd_dir, "Vskilet/eduram", false); UMLDiagramRecognizer.recogSD(sd_dir, - * "Rautiainen/Starmap", false); UMLDiagramRecognizer.recogSD(sd_dir, "zy084232/Knowing-Campus", false); - */ + // UMLDiagramRecognizer.recogSD(sd_dir, "laurikin/java-tetris", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "abhinava/indic-keyboards", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "alessandrocolantoni_mandragora", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "camillelabeille/autofocus", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "cyrus305/ver_3LibraryManagementSystem_MPP", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "dle79/ASD", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "dle79/LibraryMgt", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Edwards9489/estatge-agent-system", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "freedude/Kildare-to-Discover", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Geo-Fence/Geo-Fence", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "inved1/ch.bfh.bti7081.s2013.black", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "kevinstier/VossenEnKonijnen", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "kviniink/Skripsi", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "lordwoo/Degree-Dissertation", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "mcsinking/Group1_MPP_PROJECT", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Pulperi/MLG-360-NOSCOPE-SUDOKU-SOLVER", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "tearvan/SkripsiKIRIDataMining", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "waisuan/undergraduate", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "ws23/IndependentStudy", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Xpitfire/ufo", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "3873757/Software-Engineering", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "adeboni/blackboard-cryptanalysis", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "albanoj2/grp", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "AlinNereid/searchable-encryption", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "BackupTheBerlios/visidia-svn", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "benlau/quickandroid", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Blodir/Stackallax", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "chamhayden/COMP2911-ASS1", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W14T12/GeoChan", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W15T02_TeamTo", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "coinvent/coinvent", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "cs2103jan2015-w13-4j/main", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "gelosie/jdic", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "GiorgosMethe/PredatorVsPrey", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "GitIgitt/SE1415", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "him229/the-gold-hunters", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "jonatasdaniel/tcc", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "ktisha/archive", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "lemmy/SecuredSLP", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "leschman/Coursework", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "pekim/node-jdbc", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "plcortesc/VIN", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Richard-Dang/tetristry-game", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "seeburger-ag/jbossts", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "spectrenoir06/ProjectS2_Ring", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "SpoonLabs/astor", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "timfel/meet4xmas", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Vskilet/eduram", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "Rautiainen/Starmap", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "zy084232/Knowing-Campus", false); } } diff --git a/src/main/resources/cd/jorgearj_USDLPricing_API.txt b/src/main/resources/cd/jorgearj_USDLPricing_API.txt index 857f6bf..c9b8aaf 100644 --- a/src/main/resources/cd/jorgearj_USDLPricing_API.txt +++ b/src/main/resources/cd/jorgearj_USDLPricing_API.txt @@ -3,7 +3,7 @@ +writeToModel(model : Model): int @null@Provider %PriceVariable -%实现¥#(973,1473)Usage +%继承¥#(973,1473)Usage @+readFromModel(resource : Resource, model : Model) : usage +writeToModel(model : Model): int @null@#(1333,1363)PriceVariable @@ -12,7 +12,7 @@ ~comment : string @null@Provider %PriceVariable -%实现¥#(1392,1277)null@null@null@#(773,1093)‘QuantitativeValue +%继承¥#(1392,1277)null@null@null@#(773,1093)‘QuantitativeValue @-value : double ~minValue : double @@ -42,7 +42,7 @@ +writeToModel(model : Mode) : int @‘QualitativeValue %Value -%依赖¥#(1753,1003)Constraint +%继承¥#(1753,1003)Constraint @-name : string -iffunction : PriceFunction @@ -84,13 +84,13 @@ has price +writeToModel(model : Model): int @‘QuantitativeFeature %Feature -%依赖¥#(353,713)‘QualitativeFeature +%继承¥#(353,713)‘QualitativeFeature @-value : QualitativeValue @+readFromModel(resource : Resource, model : Model) : QualitativeFeature +writeToModel(model : Model): int @‘QualitativeFeature %Feature -%依赖¥#(1382,671)null@null@null@#(1753,503)PriceSpec +%继承¥#(1382,671)null@null@null@#(1753,503)PriceSpec @-name : string ~currency : string @@ -161,9 +161,9 @@ has price +writeToModel(model : Mode) : int @Service %Feature -%依赖¥Service +%聚合¥Service %Offering -%依赖¥#(1213,293)Offering +%聚合¥#(1213,293)Offering @-name : string -includes : List ~pricePlan - PricePlan diff --git a/src/main/resources/cd/temp result.png b/src/main/resources/cd/temp result.png index d943a61799c37b3054433cc772380bb90c3a130e..dac6a3b34a7604aba4045dab66571aea91ed5ceb 100644 GIT binary patch literal 11778 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 -- Gitee From 5fa91ce0017a0d53abaa505a621da3cdeb864227 Mon Sep 17 00:00:00 2001 From: chief Date: Sat, 11 Dec 2021 11:50:54 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E5=8F=82=E8=80=83=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hy/java/uct/sdtocode/SDToCodeTracer.java | 22 + .../uct/umlrecog/ClassDiagramRecognizer.java | 3 +- .../uct/umlrecog/UMLDiagramRecognizer.java | 2 +- .../cddetector/ClassRelationDetector.java | 4 +- src/main/resources/sdtocode/code/code path-fm | 1 + .../resources/sdtocode/code/code path-hdfs | 1 + src/main/resources/sdtocode/code/code path-mr | 1 + ...TR EXPERIMENT AS A CASE STUDY-relation.txt | 742 +++++++++ ...STR EXPERIMENT AS A CASE STUDY-simEnts.txt | 694 ++++++++ ...FASTR EXPERIMENT AS A CASE STUDY-ziyan.txt | 694 ++++++++ ...THE V-FASTR EXPERIMENT AS A CASE STUDY.txt | 637 ++++++++ ...STR EXPERIMENT AS A CASE STUDY.txt.xml.xls | Bin 0 -> 140288 bytes ...nd NPP Sounder PEATE missions-relation.txt | 591 +++++++ ...rvatory and NPP Sounder PEATE missions.txt | 716 +++++++++ ...and NPP Sounder PEATE missions.txt.xml.xls | Bin 0 -> 86528 bytes ...ive File Management Component-relation.txt | 225 +++ ... and Archive File Management Component.txt | 109 ++ ...hive File Management Component.txt.xml.xls | Bin 0 -> 33280 bytes ... - Apache Software Foundation-relation.txt | 79 + ...ng - OODT - Apache Software Foundation.txt | 46 + ...T - Apache Software Foundation.txt.xml.xls | Bin 0 -> 16384 bytes .../Interface Ingester-relation.txt | 0 .../Interface Ingester.txt | 26 + .../Interface Ingester.txt.xml.xls | Bin 0 -> 4096 bytes ...buted Storage Resource Broker-relation.txt | 664 ++++++++ ...en Distributed Storage Resource Broker.txt | 141 ++ ...ibuted Storage Resource Broker.txt.xml.xls | Bin 0 -> 89600 bytes .../OODT Filemgr User Guide-relation.txt | 204 +++ .../OODT Filemgr User Guide.txt | 299 ++++ .../OODT Filemgr User Guide.txt.xml.xls | Bin 0 -> 31232 bytes ...e.oodt.cas.filemgr.cli.action-relation.txt | 0 ...org.apache.oodt.cas.filemgr.cli.action.txt | 26 + ...he.oodt.cas.filemgr.cli.action.txt.xml.xls | Bin 0 -> 4096 bytes .../React file manager-relation.txt | 770 +++++++++ .../React file manager.txt | 1 + .../React file manager.txt.xml.xls | Bin 0 -> 105472 bytes ...File Manager Developer Guide-relation.txt" | 221 +++ ...\223 CAS File Manager Developer Guide.txt" | 100 ++ ... File Manager Developer Guide.txt.xml.xls" | Bin 0 -> 32256 bytes ...L DOCUMENTATION - MODULE VIEW-relation.txt | 111 ++ ...HITECTURAL DOCUMENTATION - MODULE VIEW.txt | 75 + ...AL DOCUMENTATION - MODULE VIEW.txt.xml.xls | Bin 0 -> 18432 bytes .../Hadoop HDFS/HADOOP ECOSYSTEM-relation.txt | 359 +++++ .../doc/Hadoop HDFS/HADOOP ECOSYSTEM.txt | 139 ++ .../Hadoop HDFS/HADOOP ECOSYSTEM.txt.xml.xls | Bin 0 -> 48640 bytes .../HDFS Architecture Guide-relation.txt | 548 +++++++ .../Hadoop HDFS/HDFS Architecture Guide.txt | 172 ++ .../HDFS Architecture Guide.txt.xml.xls | Bin 0 -> 74752 bytes .../HDFS Architecture-relation.txt | 561 +++++++ .../doc/Hadoop HDFS/HDFS Architecture.txt | 359 +++++ .../Hadoop HDFS/HDFS Architecture.txt.xml.xls | Bin 0 -> 76288 bytes .../doc/Hadoop HDFS/HDFS-relation.txt | 204 +++ .../sdtocode/doc/Hadoop HDFS/HDFS.txt | 36 + .../sdtocode/doc/Hadoop HDFS/HDFS.txt.xml.xls | Bin 0 -> 29184 bytes ...HDFS for Every Data Engineer-relation.txt" | 258 +++ ...Guide to HDFS for Every Data Engineer.txt" | 161 ++ ... HDFS for Every Data Engineer.txt.xml.xls" | Bin 0 -> 35328 bytes ...e Explanation and Assumptions-relation.txt | 457 ++++++ ...chitecture Explanation and Assumptions.txt | 198 +++ ...re Explanation and Assumptions.txt.xml.xls | Bin 0 -> 65536 bytes ...Hadoop architectural overview-relation.txt | 359 +++++ .../Hadoop architectural overview-simEnts.txt | 76 + .../Hadoop architectural overview-ziyan.txt | 76 + .../Hadoop architectural overview.txt | 149 ++ .../Hadoop architectural overview.txt.xml.xls | Bin 0 -> 50688 bytes ...42\204\242 persistent memory-relation.txt" | 152 ++ ...256 XPD\342\204\242 persistent memory.txt" | 1138 +++++++++++++ ...342\204\242 persistent memory.txt.xml.xls" | Bin 0 -> 22528 bytes ...y Design of HDFS Architecture-relation.txt | 176 +++ .../Key Design of HDFS Architecture.txt | 294 ++++ ...ey Design of HDFS Architecture.txt.xml.xls | Bin 0 -> 29696 bytes ...ystem Architecture and Design-relation.txt | 527 ++++++ ...ed File System Architecture and Design.txt | 380 +++++ ...System Architecture and Design.txt.xml.xls | Bin 0 -> 75264 bytes ... A Scalable HDFS Architecture-relation.txt | 635 ++++++++ .../Towards A Scalable HDFS Architecture.txt | 205 +++ ...s A Scalable HDFS Architecture.txt.xml.xls | Bin 0 -> 86016 bytes ...ICATION TO INTERNET OF THINGS-relation.txt | 920 +++++++++++ ...LICATION TO INTERNET OF THINGS-simEnts.txt | 74 + ...PPLICATION TO INTERNET OF THINGS-ziyan.txt | 74 + ...WITH APPLICATION TO INTERNET OF THINGS.txt | 898 +++++++++++ ...LICATION TO INTERNET OF THINGS.txt.xml.xls | Bin 0 -> 126464 bytes ...0\223 HDFS, YARN & MapReduce-relation.txt" | 214 +++ ...e \342\200\223 HDFS, YARN & MapReduce.txt" | 152 ++ ...00\223 HDFS, YARN & MapReduce.txt.xml.xls" | Bin 0 -> 30720 bytes ...ysis Challenges and Solutions-relation.txt | 646 ++++++++ ...Data Analysis Challenges and Solutions.txt | 146 ++ ...lysis Challenges and Solutions.txt.xml.xls | Bin 0 -> 89088 bytes ...t on Wireless Sensor Networks-relation.txt | 4 + ...Management on Wireless Sensor Networks.txt | 43 + ...nt on Wireless Sensor Networks.txt.xml.xls | Bin 0 -> 4608 bytes .../Hadoop - MapReduce-relation.txt | 176 +++ .../Hadoop MapReduce/Hadoop - MapReduce.txt | 469 ++++++ .../Hadoop - MapReduce.txt.xml.xls | Bin 0 -> 27648 bytes ...0\223 HDFS, Yarn & MapReduce-relation.txt" | 346 ++++ ...l \342\200\223 HDFS, Yarn & MapReduce.txt" | 161 ++ ...00\223 HDFS, Yarn & MapReduce.txt.xml.xls" | Bin 0 -> 46592 bytes ...essing Framework for Big Data-relation.txt | 16 + ...ased Processing Framework for Big Data.txt | 21 + ...cessing Framework for Big Data.txt.xml.xls | Bin 0 -> 6144 bytes .../MapReduce Architecture1-relation.txt | 107 ++ .../MapReduce Architecture1.txt | 48 + .../MapReduce Architecture1.txt.xml.xls | Bin 0 -> 16896 bytes .../MapReduce Architecture2-relation.txt | 117 ++ .../MapReduce Architecture2.txt | 72 + .../MapReduce Architecture2.txt.xml.xls | Bin 0 -> 18432 bytes .../MapReduce Architecture3-relation.txt | 71 + .../MapReduce Architecture3.txt | 32 + .../MapReduce Architecture3.txt.xml.xls | Bin 0 -> 12800 bytes .../MapReduce Tutorial-relation.txt | 1118 +++++++++++++ .../Hadoop MapReduce/MapReduce Tutorial.txt | 853 ++++++++++ .../MapReduce Tutorial.txt.xml.xls | Bin 0 -> 145408 bytes ...Reduce Working and Components-relation.txt | 97 ++ .../MapReduce Working and Components.txt | 48 + ...pReduce Working and Components.txt.xml.xls | Bin 0 -> 15872 bytes ...duce \342\200\223 Components-relation.txt" | 22 + .../MapReduce \342\200\223 Components.txt" | 24 + ...educe \342\200\223 Components.txt.xml.xls" | Bin 0 -> 6656 bytes .../Hadoop MapReduce/MapReduce-relation.txt | 118 ++ .../doc/Hadoop MapReduce/MapReduce.txt | 39 + .../Hadoop MapReduce/MapReduce.txt.xml.xls | Bin 0 -> 18944 bytes ...rstanding MapReduce in Hadoop-relation.txt | 223 +++ .../Understanding MapReduce in Hadoop.txt | 178 +++ ...erstanding MapReduce in Hadoop.txt.xml.xls | Bin 0 -> 31232 bytes ...n Important Overview For 2021-relation.txt | 123 ++ ...tecture An Important Overview For 2021.txt | 73 + ...An Important Overview For 2021.txt.xml.xls | Bin 0 -> 19968 bytes ...e the components of MapReduce-relation.txt | 7 + .../What are the components of MapReduce.txt | 6 + ...re the components of MapReduce.txt.xml.xls | Bin 0 -> 5120 bytes .../mapreduce_hadoop2-relation.txt | 520 ++++++ .../Hadoop MapReduce/mapreduce_hadoop2.txt | 1407 +++++++++++++++++ .../mapreduce_hadoop2.txt.xml.xls | Bin 0 -> 94720 bytes .../resources/sdtocode/sd/Fig1SeqDiagram.jfif | Bin 0 -> 52838 bytes .../resources/sdtocode/sd/Fig2SeqDiagram.jfif | Bin 0 -> 78138 bytes .../sdtocode/sd/Rautiainen_Starmap.txt | 95 ++ .../sdtocode/sd/laurikin_java-tetris.txt | 124 ++ .../sdtocode/sd/sd-Rautiainen_Starmap.jpg | Bin 0 -> 55544 bytes .../sdtocode/sd/sd-laurikin_java-tetris.jpeg | Bin 0 -> 51181 bytes 139 files changed, 24703 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/sdtocode/code/code path-fm create mode 100644 src/main/resources/sdtocode/code/code path-hdfs create mode 100644 src/main/resources/sdtocode/code/code path-mr create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-simEnts.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-ziyan.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/File Manager Scale Out Planning - OODT - Apache Software Foundation-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/File Manager Scale Out Planning - OODT - Apache Software Foundation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/File Manager Scale Out Planning - OODT - Apache Software Foundation.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt create mode 100644 src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt.xml.xls create mode 100644 "src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide-relation.txt" create mode 100644 "src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt" create mode 100644 "src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt.xml.xls" create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP ECOSYSTEM-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP ECOSYSTEM.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP ECOSYSTEM.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt.xml.xls create mode 100644 "src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer-relation.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt.xml.xls" create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop HDFS Architecture Explanation and Assumptions-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop HDFS Architecture Explanation and Assumptions.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop HDFS Architecture Explanation and Assumptions.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview-simEnts.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview-ziyan.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview.txt.xml.xls create mode 100644 "src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory-relation.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt.xml.xls" create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-simEnts.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-ziyan.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt.xml.xls create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce-relation.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt.xml.xls" create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Management on Wireless Sensor Networks-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Management on Wireless Sensor Networks.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Management on Wireless Sensor Networks.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt.xml.xls create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce-relation.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt.xml.xls" create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt.xml.xls create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components-relation.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt" create mode 100644 "src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt.xml.xls" create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/What Is MapReduce Architecture An Important Overview For 2021-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/What Is MapReduce Architecture An Important Overview For 2021.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/What Is MapReduce Architecture An Important Overview For 2021.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt.xml.xls create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2-relation.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt create mode 100644 src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt.xml.xls create mode 100644 src/main/resources/sdtocode/sd/Fig1SeqDiagram.jfif create mode 100644 src/main/resources/sdtocode/sd/Fig2SeqDiagram.jfif create mode 100644 src/main/resources/sdtocode/sd/Rautiainen_Starmap.txt create mode 100644 src/main/resources/sdtocode/sd/laurikin_java-tetris.txt create mode 100644 src/main/resources/sdtocode/sd/sd-Rautiainen_Starmap.jpg create mode 100644 src/main/resources/sdtocode/sd/sd-laurikin_java-tetris.jpeg diff --git a/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java b/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java index 16b1dfd..28b62f2 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java +++ b/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java @@ -1,7 +1,29 @@ package com.hy.java.uct.sdtocode; public class SDToCodeTracer { + /** + * 将要追踪的顺序图放在sd_dir目录下 + */ + private static final String sd_dir = System.getProperty("user.dir") + "\\src\\main\\resources\\sdtocode\\sd\\"; + /** + * 将设计文档放在doc_dir目录下 + */ + private static final String doc_dir = System.getProperty("user.dir") + "\\src\\main\\resources\\sdtocode\\doc\\"; + + /** + * 将要追踪的代码放在code_dir目录下 + */ + private static final String code_dir = System.getProperty("user.dir") + "\\src\\main\\resources\\sdtocode\\code\\"; + + /** + * 将追踪结果放在res_dir目录下 + */ + private static final String res_dir = System.getProperty("user.dir") + "\\src\\main\\resources\\sdtocode\\"; + + /** + * 针对顺序图及其相关文档,追踪到代码中的类 + */ public static void main(String[] args) { // TODO Auto-generated method stub diff --git a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java index 7571537..56a2458 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java @@ -86,6 +86,7 @@ public class ClassDiagramRecognizer { public static void recogT(String cd_dir, String repo_name) { // 遍历cd_dir下的文件,寻找repo_name对应的图片,存在repo_cd_path中 String repo_cd_path = findCD(cd_dir, repo_name); + List class_list = null; if (repo_cd_path != null) { // 导入OpenCV库,开始识别 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); @@ -101,7 +102,7 @@ public class ClassDiagramRecognizer { ClassRelationDetector cls_relation_detector = new ClassRelationDetector(repo_cd_path, classes); cls_relation_detector.recog(); Pair> classes_with_relations = cls_relation_detector.getResult(); - List class_list = classes_with_relations.getRight(); + class_list = classes_with_relations.getRight(); for (UMLClass UML_class : class_list) { System.out.println(UML_class + " done"); } diff --git a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java index 78cf56c..0f15f07 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java @@ -44,7 +44,7 @@ public class UMLDiagramRecognizer { /* * 测试一下识别特定的类图和顺序图 * - * 是否没有文件 + * 是否没有 */ public static void main(String[] args) { // 类图实验 diff --git a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java index 5724172..051a6c8 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java +++ b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java @@ -502,7 +502,8 @@ public class ClassRelationDetector { // 对“轮廓”做二次逼近,获取关系符号形状。第一次逼近可以误差大一点,得到大致形状;第二次逼近误差要小一点,得到精确形状 Imgproc.approxPolyDP(origin_curve, origin_approx_curve, 0.05 * Imgproc.arcLength(origin_curve, false), true); Imgproc.approxPolyDP(origin_approx_curve, origin_approx_curve, 0.01 * Imgproc.arcLength(origin_approx_curve, true), true); - double threshold = BizaareSituations.getThreshold(0, 0, 0, 0, 0, 0, 0); + double threshold = BizaareSituations.getThreshold(1, 1, 0, 1, 1, 1, 0); + // double threshold = BizaareSituations.getThreshold(1, 1, 0, 1, 1, 0, 0); // double threshold = BizaareSituations.getThreshold(0.2, 0.3, 0.5, 0.55, 0.6, 0.1, 0.03); // 如果逼近得到三角形,则基本就是继承了,再检查一下位置即可(其实检不检查作用不大) if (origin_approx_curve.toArray().length <= 5) { @@ -532,6 +533,7 @@ public class ClassRelationDetector { temp_pt2.x -= rect_containing_rela_type.x; temp_pt2.y -= rect_containing_rela_type.y; if (rect_possible_containing_ext.contains(temp_pt0) || rect_possible_containing_ext.contains(temp_pt1) || rect_possible_containing_ext.contains(temp_pt2)) { + // 看图是否异常 if (threshold <= BizaareSituations.rect_containing_tri_to_be_ext) { type = "继承"; } else { diff --git a/src/main/resources/sdtocode/code/code path-fm b/src/main/resources/sdtocode/code/code path-fm new file mode 100644 index 0000000..3111850 --- /dev/null +++ b/src/main/resources/sdtocode/code/code path-fm @@ -0,0 +1 @@ +D:\eclipse-committers\Apache OODT File Manager \ No newline at end of file diff --git a/src/main/resources/sdtocode/code/code path-hdfs b/src/main/resources/sdtocode/code/code path-hdfs new file mode 100644 index 0000000..040adc0 --- /dev/null +++ b/src/main/resources/sdtocode/code/code path-hdfs @@ -0,0 +1 @@ +D:\eclipse-committers\Hadoop HDFS \ No newline at end of file diff --git a/src/main/resources/sdtocode/code/code path-mr b/src/main/resources/sdtocode/code/code path-mr new file mode 100644 index 0000000..3663326 --- /dev/null +++ b/src/main/resources/sdtocode/code/code path-mr @@ -0,0 +1 @@ +D:\eclipse-committers\Hadoop MapReduce \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-relation.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-relation.txt new file mode 100644 index 0000000..cac5cd6 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-relation.txt @@ -0,0 +1,742 @@ +v-fastr experiment&a case study andrew f. hart and Pasadena and CA 91109 and USA&依赖 +FRAMEWORK&radio-frequency energy&依赖 +California Institute&Technology&AGGREGATION +v-fastr experiment&a case study andrew f. hart and Pasadena and CA 91109 and USA&依赖 +FRAMEWORK&bright millisecond pulse&依赖 +bright millisecond pulse&radio-frequency energy&AGGREGATION +shortduration pulse&known object&依赖 +shortduration pulse&pulsar&依赖 +identification and verification&event&AGGREGATION +one major goal&very long baseline array ( vlba ) fast transient experiment ( v-fastr )&AGGREGATION +V-FASTR&“ commensal ” ( piggy-back ) approach&依赖 +Raw datum&buffer memory&依赖 +buffer memory&comprehensive off-line analysis&依赖 +astrophysical origin&detection&AGGREGATION +promising signal&more in-depth investigation&依赖 +candidate&analyst&依赖 +we&metadata-driven , collaborative candidate review framework&依赖 +timely analysis&fast transient detection candidate&AGGREGATION +software pipeline&pipeline&GENERALIZATION +framework&software pipeline&依赖 +framework&metadata processing&依赖 +facilitates browsing and inspection&available metada&AGGREGATION +current primary goal&radio astronomy&AGGREGATION +INTRODUCTION One&” ( and cordes et al. 2004 )&依赖 +INTRODUCTION One&cordes et al. 2004 )&依赖 +INTRODUCTION One&cordes et al. 2004 )&依赖 +INTRODUCTION One&” ( and cordes et al. 2004 )&依赖 +INTRODUCTION One&” ( and cordes et al. 2004 )&依赖 +INTRODUCTION One&cordes et al. 2004 )&依赖 +INTRODUCTION One¤t primary goal&AGGREGATION +scientific thrust&contrast&依赖 +scientific thrust&known source&依赖 +scientific thrust&transient event&依赖 +generate catalog&known source&AGGREGATION +scientific thrust&generate catalog&依赖 +scope and distribution&different transient source&AGGREGATION +We&different transient source&依赖 +We&scope and distribution&依赖 +“ most exciting&sources ”&依赖 +new class&sources ”&AGGREGATION +“ most exciting&original )&依赖 +“ most exciting&sources ”&依赖 +discovery&sources ”&AGGREGATION +“ most exciting&new class&依赖 +discovery&new class&AGGREGATION +“ most exciting&( italics&依赖 +Radio telescope&sky&依赖 +their&data& +detection and characterization and ” which&“ fast radio transient&AGGREGATION +detection and characterization and ” which¤t particular interest&依赖 +detection and characterization and ” which¤t particular interest&依赖 +small fraction&second&AGGREGATION +V-FASTR experiment&radio astronomy experiment&依赖 +one&new breed&AGGREGATION +new breed&radio astronomy experiment&AGGREGATION +V-FASTR experiment&transient radio signal&依赖 +V-FASTR experiment&experiment&GENERALIZATION +V-FASTR experiment&transient radio signal&依赖 +V-FASTR experiment&radio astronomy experiment&依赖 +its&instrument& +regular processing activity&host instrument&AGGREGATION +V-FASTR experiment&2 and 10 telescope&依赖 +V-FASTR experiment&National Radio Astronomy Observatory ʼs&依赖 +V-FASTR experiment&National Radio Astronomy Observatory ʼs&依赖 +2 and 10 telescope&National Radio Astronomy Observatory ʼs ( nrao ) very long baseline array ( vlba ) ( romney 2010 )&AGGREGATION +V-FASTR experiment&2 and 10 telescope&依赖 +V-FASTR experiment&( rfus ) and potentially genuine astronomical pulse&依赖 +V-FASTR experiment&configuration&依赖 +VLBA&10 25 m telescope&依赖 +V-FASTR experiment&thompson et al. 2011 )&依赖 +instance&terrestrial Radio Frequency Interference ( rfus ) and potentially genuine astronomical pulse&AGGREGATION +huge volume&entire observing session infeasible&依赖 +huge volume&full record&依赖 +huge volume&full record&依赖 +its&operation& +course&operation&AGGREGATION +full record&entire observing session infeasible&AGGREGATION +huge volume&entire observing session infeasible&依赖 +huge volume&entire observing session infeasible&依赖 +huge volume&raw time-series voltage datum&AGGREGATION +huge volume&full record&依赖 +considerable effort&noisy and often incomplete datum&依赖 +considerable effort&consequence&依赖 +considerable effort&interesting signal&依赖 +considerable effort&fine-tuning algorithm&依赖 +considerable effort&realtime identification&依赖 +realtime identification&interesting signal&AGGREGATION +considerable effort&Thompson et al. 2011&依赖 +datum&distributed V-FASTR science team&依赖 +member&distributed V-FASTR science team&AGGREGATION +datum&daily basis&依赖 +datum&member&依赖 +V-FASTR science team&science team&GENERALIZATION +practical workload constraint&candidate detection&依赖 +V-FASTR experiment&several important resource constraint&依赖 +practical workload constraint&candidate detection&依赖 +we&V-FASTR experiment&依赖 +automatic capture and organization&metada&AGGREGATION +framework&set&依赖 +set&software component&AGGREGATION +framework&candidate event&依赖 +framework&software component&依赖 +collaborative perusal and inspection&related imagery datum&AGGREGATION +rest&paper&AGGREGATION +rest&system&依赖 +rest&system&依赖 +we&more general context&依赖 +we&Section 2&依赖 +our&project& +we&project&依赖 +architectural description&system&AGGREGATION +Section 3&methodology&依赖 +evaluation&Astronomical Journal 149:23 ( 7pp )&AGGREGATION +We&evaluation&依赖 +We&Astronomical Journal&依赖 +We&149:23 ( 7pp )&依赖 +our&experience& +development&scientific data system&AGGREGATION +we&VFASTR experiment&依赖 +context&system implementation&AGGREGATION +We&object oriented data technology ( oodt ) project&依赖 +open source information integration platform&framework&依赖 +open source information integration platform¢ral role&依赖 +We&open source information integration platform&依赖 +our&framework& +we&online tool&依赖 +we&several related effort&依赖 +Principal investigator&proposal&依赖 +Principal investigator&VLBA&依赖 +V-FASTR&datum&依赖 +V-FASTR&datum&依赖 +part&routine processing&AGGREGATION +nightly list&candidate&AGGREGATION +V-FASTR&datum&依赖 +candidate list&timely basis&依赖 +candidate list&expert&依赖 +raw datum&significant disk space&依赖 +generation&sky image&AGGREGATION +their&space& +source&signal&AGGREGATION +Software tool&review process&依赖 +Software tool&candidate reviewer&依赖 +review process&process&GENERALIZATION +jpl data management systems and technologies group&software ground data system&依赖 +jpl data management systems and technologies group&software ground data system&依赖 +they&scientist&依赖 +other operational constraint&expected production environment&AGGREGATION +process&project scientist&依赖 +process&close collaboration&依赖 +understanding&processing algorithm&AGGREGATION +sense&scale and throughput requirement&AGGREGATION +broad spectrum&domain&AGGREGATION +group&data system experience&依赖 +group&diverse portfolio&依赖 +group&data system experience&依赖 +group&diverse portfolio&依赖 +group&diverse portfolio&依赖 +group&data system experience&依赖 +group&data system experience&依赖 +group&data system experience&依赖 +group&data system experience&依赖 +group&diverse portfolio&依赖 +group&diverse portfolio&依赖 +group&diverse portfolio&依赖 +diverse portfolio&data system experience&AGGREGATION +Open Source&software component&依赖 +their&design& +suite&software component&AGGREGATION +OODT1&investment&依赖 +long track record&experience&AGGREGATION +mission-specific customization&top&依赖 +realm&scientific data processing system&AGGREGATION +OODT1&individual mission data system&依赖 +OODT One&product&AGGREGATION +reusable platform&configurable component&AGGREGATION +OODT1&return&依赖 +part&NASAʼs Office&AGGREGATION +NASAʼs Office&Space Science&AGGREGATION +product&long track record&AGGREGATION +Open Source&known&依赖 +OODT&architecture&依赖 +component&one another&依赖 +component&XML-RPC2&依赖 +component&standard , open protocol&依赖 +Its&components& +2009 oodt&transition&依赖 +2009 oodt&JPL-internal development project&依赖 +2009 oodt&free and open source software project&依赖 +2009 oodt&JPL-internal development project&依赖 +2009 oodt&free and open source software project&依赖 +2009 oodt&transition&依赖 +OODT&ASF&依赖 +varied group&scientific and commercial endeavor&AGGREGATION +OODT&several public release&依赖 +several OODT component&candidate validation framework&依赖 +several OODT component&core platform&依赖 +core platform&candidate validation framework&AGGREGATION +we&Section 3&依赖 +ready availability&time and budgetary consideration&依赖 +ready availability&project&依赖 +ready availability&time and budgetary consideration&依赖 +ready availability&project&依赖 +ready availability&time and budgetary consideration&依赖 +ready availability&time and budgetary consideration&依赖 +ready availability&OODT component&AGGREGATION +their&pedigree& +ready availability&project&依赖 +ready availability&project&依赖 +several ongoing effort&online tool&依赖 +collaborative review and classification&scientific observation&AGGREGATION +we§ion&依赖 +we&several ongoing effort&依赖 +several ongoing effort&assist&依赖 +part&series&AGGREGATION +Astropulse Astropulse&sky survey&依赖 +Astropulse Astropulse&radio pulse&依赖 +University&berkeley (&AGGREGATION +series&sky survey&AGGREGATION +Astropulse Astropulse&Astropulse&GENERALIZATION +Astropulse Astropulse&series&依赖 +Astropulse project&survey&依赖 +Astropulse project&survey&依赖 +Astropulse project&project&GENERALIZATION +Astropulse project&survey&依赖 +Astropulse project&sky&依赖 +survey&sky&AGGREGATION +Astropulse project&sky&依赖 +Astropulse project&sky&依赖 +v-fastrʼs ability&greater positional accuracy&依赖 +Astropulseʼs use&excellent sensitivity&依赖 +v-fastrʼs ability&greater positional accuracy&依赖 +v-fastrʼs ability&greater positional accuracy&依赖 +v-fastrʼs ability&greater positional accuracy&依赖 +Astropulseʼs use&excellent sensitivity&依赖 +Astropulseʼs use&Areciboʼs enormous single dish telescope&AGGREGATION +variant&SETI@home project&AGGREGATION +Astropulse&same distributed , collaborative volunteer computing infrastructure&依赖 +Astropulse&same distributed , collaborative volunteer computing infrastructure&依赖 +Astropulse&same distributed , collaborative volunteer computing infrastructure&依赖 +Astropulse&same distributed , collaborative volunteer computing infrastructure&依赖 +origin&signal&AGGREGATION +number&intense transformations and calculation&AGGREGATION +intense transformations and calculation&datum&AGGREGATION +unit&computational work&AGGREGATION +use&volunteer computing&AGGREGATION +automated nature&V-FASTRʼs manual review requirement&依赖 +automated nature&approach&AGGREGATION +automated nature&V-FASTRʼs manual review requirement&依赖 +help&volunteer&AGGREGATION +large database&galaxy image&AGGREGATION +2015 january hart et al&rotation&AGGREGATION +project&date&依赖 +discovery&new interesting object&AGGREGATION +million&image&AGGREGATION +confirmation&important scientific hypothesis&AGGREGATION +formulation&new one&AGGREGATION +success&expectation&依赖 +project&success&依赖 +challenge&image classification&AGGREGATION +paradigm&v-fastr setting&依赖 +nature&archive&AGGREGATION +its&limits& +Galaxy Zoo&volunteer reviewer&依赖 +its&reviewers& +Galaxy Zoo&leisurely peruse&依赖 +University&Washington&AGGREGATION +it&“ crowd-sourced ” attempt&依赖 +protein and chain&wide range&依赖 +protein and chain&wide range&依赖 +protein and chain&human disease&依赖 +they&specific shape&依赖 +protein and chain&key role&依赖 +protein and chain&key role&依赖 +wide range&human disease&AGGREGATION +protein and chain&key role&依赖 +protein and chain&human disease&依赖 +their&function& +they&themselves&依赖 +chain&amino acid&AGGREGATION +protein and chain&human disease&依赖 +specific shape&function&依赖 +protein and chain&wide range&依赖 +researcher&challenge&依赖 +researcher&puzzle-solving capability&依赖 +researcher&challenge&依赖 +researcher&scale and complexity&依赖 +researcher&scale and complexity&依赖 +researcher&human being&依赖 +researcher&assistance&依赖 +researcher&assistance&依赖 +researcher&human being&依赖 +researcher&puzzle-solving capability&依赖 +scale and complexity&challenge&AGGREGATION +puzzle-solving capability&human being&AGGREGATION +player&arriving&依赖 +arrangement&total energy&依赖 +player&goal&依赖 +unknown and diverse strategy&human participant&AGGREGATION +its&participants& +Foldit&environment&依赖 +project&400,000 player&依赖 +implementation&metadata-driven framework&AGGREGATION +online review&V-FASTR candidate detection event&AGGREGATION +presentation&system architecture&AGGREGATION +our&methodology& +our&design& +consideration&design&依赖 +We&methodology&依赖 +their&imprint& +Development Methodology Several factor&development process&依赖 +development process&process&GENERALIZATION +need&VFASTR project&AGGREGATION +our&implementation& +aspect&design process&AGGREGATION +group&substantial experience&依赖 +group&broad range&实现 +our&group& +broad range&scientific domain&AGGREGATION +design and implementation&data system&AGGREGATION +group&design and implementation&依赖 +group&data system&实现 +close working relationship&success&依赖 +close working relationship&case&依赖 +success&project&AGGREGATION +close working relationship&project&依赖 +close working relationship&case&依赖 +close working relationship&success&依赖 +member&project science team&AGGREGATION +close working relationship&case&依赖 +close working relationship&success&依赖 +close working relationship&project&依赖 +close working relationship&project&依赖 +intuition&us&依赖 +intuition&software engineer&依赖 +our&intuitions& +intuition&software engineer&依赖 +intuition&software engineer&依赖 +intuition&us&依赖 +intuition&us&依赖 +technical challenge&system&AGGREGATION +it&V-FASTR science team&依赖 +it&member&依赖 +early identification&issue&AGGREGATION +our&communication& +member&V-FASTR science team&AGGREGATION +current system architecture&ongoing feedback loop&依赖 +current system architecture&science and software team&依赖 +direct result&ongoing feedback loop&AGGREGATION +part®ular third-party use&AGGREGATION +regular third-party use&VLBA instrument&AGGREGATION +experiment&“ guest ” status&依赖 +experiment&NRAO computing infrastructure&依赖 +experiment&“ guest ” status&依赖 +many&architectural decision&AGGREGATION +physical constraint&architectural decision&依赖 +physical constraint&many&依赖 +two type&product&AGGREGATION +data product&product&GENERALIZATION +hundred&file&AGGREGATION +V-FASTR data product&file&依赖 +V-FASTR data product&data product&GENERALIZATION +~ 800 job&~ 10 GB&AGGREGATION +storage&few week&依赖 +product&~ 10 – 20&依赖 +average rate&~ 10 – 20&AGGREGATION +product&average rate&依赖 +product&day (&依赖 +product&science team analyst&依赖 +candidate&review&依赖 +overview&average data volume&AGGREGATION +candidate&higher-resolution processing (&依赖 +core&design&AGGREGATION +network bandwidth constraint&host&AGGREGATION +network bandwidth constraint&us&依赖 +network bandwidth constraint&data transfer configuration&依赖 +complete transfer&raw , unreviewed , and possibly spurious detection datum&AGGREGATION +network bandwidth constraint&data transfer configuration&依赖 +network bandwidth constraint&us&依赖 +salient characteristic&candidate event&AGGREGATION +metada sufficient&candidate review framework&依赖 +candidate event&event&GENERALIZATION +careful selection process&beneficial side effect&依赖 +careful selection process&size&依赖 +careful selection process&allowing&依赖 +size&transferred product&AGGREGATION +longer retention period&JPL&依赖 +longer retention period&JPL&依赖 +security constraint&design&依赖 +system&two separate security domain&依赖 +system&NRAO and JPL&依赖 +security requirement&host system&AGGREGATION +functionality&possibility&依赖 +possibility&corruption&AGGREGATION +functionality&corruption&依赖 +functionality&corruption&依赖 +functionality&possibility&依赖 +software framework&framework&GENERALIZATION +we&consisting&依赖 +capture , transfer , and storage&metadata annotation&AGGREGATION +two principal component&capture , transfer , and storage&依赖 +web portal&portal&GENERALIZATION +we&software framework&依赖 +two principal component&metadata annotation&依赖 +V-FASTR data product&Metadata Pipeline&依赖 +V-FASTR data product&JPL side&依赖 +V-FASTR data product&metadata extraction and data archiving pipeline&依赖 +pipeline&three major software component&依赖 +pipeline&rsync&依赖 +Data product&NRAO staging area&依赖 +Data product&jpl server use rsync&依赖 +content&directory tree&AGGREGATION +jpl server use rsync&two server&依赖 +jpl server use rsync&minimal human intervention&依赖 +jpl server use rsync&content&依赖 +It&simplicity&依赖 +wide range&configuration option&AGGREGATION +its&simplicity& +file&compressed format&依赖 +client&product directory tree&依赖 +client&datum&依赖 +client&metada&依赖 +small subset&datum&AGGREGATION +client&small subset&依赖 +reduction&data product size&AGGREGATION +factor&3.5 � 103&AGGREGATION +average size&~ 35 GB&AGGREGATION +data product&JPL server&依赖 +OODT CAS Crawler daemon&new product&依赖 +they&OODT CAS Crawler daemon&依赖 +product directory&indicating&依赖 +named product&file manager catalog and ( 2 )&依赖 +product directory&special marker file&依赖 +no file&missing& +software component&component&GENERALIZATION +File Manager&project&依赖 +Depiction&volume estimate&依赖 +Depiction&job )&依赖 +Depiction&job )&依赖 +Depiction&volume estimate&依赖 +Depiction&volume estimate&依赖 +Depiction&job )&依赖 +Depiction&job )&依赖 +Depiction&full v-fastr datum flow&AGGREGATION +Depiction&volume estimate&依赖 +Depiction&volume estimate&依赖 +Depiction&job )&依赖 +candidate review framework&A and B&依赖 +candidate review framework&metada and derive product repository&依赖 +candidate review framework&metada and derive product repository&依赖 +candidate review framework&intersection&依赖 +intersection&A and B&AGGREGATION +candidate review framework&A and B&依赖 +candidate review framework&intersection&依赖 +rsync process&NRAO server&依赖 +Astronomical Journal 149:23 ( 7pp )&2015 january hart et al&依赖 +Astronomical Journal 149:23 ( 7pp )&2015 january hart et al&依赖 +Astronomical Journal 149:23 ( 7pp )&in-place&依赖 +Astronomical Journal 149:23 ( 7pp )&in-place&依赖 +rsync process&them&依赖 +we&OODT framework&依赖 +extensibility&OODT framework&AGGREGATION +we&extensibility&依赖 +OODT framework&framework&GENERALIZATION +three level&V-FASTR data product&依赖 +Information&job , scan , and event&依赖 +hierarchy&V-FASTR data product&AGGREGATION +Information&three level&依赖 +pair&available image&AGGREGATION +event&them&依赖 +File Manager&metada&依赖 +File Manager&back-end catalog&依赖 +File Manager&different object type&依赖 +its&catalog& +field&named key&依赖 +querying&information&AGGREGATION +decision&desire&依赖 +metada&single request&依赖 +metada&File Manager&依赖 +decision&querying&实现 +decision&web portal client&实现 +ingestion&dynamically name metadata field&AGGREGATION +second major component&candidate review framework&AGGREGATION +primary purpose&portal&AGGREGATION +location-independent perusal and assessment&potential candidate&AGGREGATION +top&Apache HTTPD Web Server&AGGREGATION +portal&Apache OODT Balance web framework&实现 +portal&running&实现 +portal&PHP web application&实现 +OODT Balance&its ability&依赖 +its&ability& +OODT Balance&integrate&依赖 +flexible , modular approach&web portal&依赖 +flexible , modular approach&framework&AGGREGATION +flexible , modular approach&web portal&依赖 +flexible , modular approach&us&依赖 +flexible , modular approach&us&依赖 +web portal&view&依赖 +web portal&available metada&依赖 +variety&view&AGGREGATION +web portal&variety&依赖 +web portal&view&依赖 +view&available metada&AGGREGATION +web portal&available metada&依赖 +web portal&variety&依赖 +job or run&multiple scan&依赖 +job or run&highest level&依赖 +layout&portal view&AGGREGATION +nature&signal&AGGREGATION +level&individual event candidate Figure 3&AGGREGATION +two graphical representation&nature&依赖 +two graphical representation&analyst&依赖 +two graphical representation&event&AGGREGATION +two graphical representation&analyst&依赖 +two graphical representation&signal&依赖 +two graphical representation&nature&依赖 +two graphical representation&signal&依赖 +part&initial candidate identification process&AGGREGATION +necessary structural clue&received signal&依赖 +product&RFI&AGGREGATION +image representation&an entire job ( many event&AGGREGATION +portal user&traditional , hierarchical navigation&依赖 +portal user&job&依赖 +metadata pipeline component&VFASTR candidate review framework&AGGREGATION +5&end-to-end framework&依赖 +5&capture , archiving&依赖 +5&end-to-end framework&依赖 +5&capture , archiving&依赖 +analysis process&process&GENERALIZATION +system&analysis process&依赖 +overall efficiency&project&AGGREGATION +online collaborative validation&fast transient candidate&AGGREGATION +candidate review framework&online collaborative validation&依赖 +we&previous section&依赖 +candidate review framework&model&依赖 +candidate review framework&fast transient candidate&依赖 +candidate review framework&fast transient candidate&依赖 +candidate review framework&model&依赖 +candidate review framework&model&依赖 +candidate review framework&online collaborative validation&依赖 +candidate review framework&fast transient candidate&依赖 +candidate review framework&online collaborative validation&依赖 +analyst&observational datum&依赖 +model&online collaborative validation&AGGREGATION +analyst&efficiency&依赖 +team&dispersed analyst&AGGREGATION +we&experience&依赖 +we&early result&依赖 +we&early result&依赖 +we&experience&依赖 +early result&experience&AGGREGATION +we&experience&依赖 +its&utility& +we&early result&依赖 +operational deployment&framework&AGGREGATION +we&early result&依赖 +we&experience&依赖 +evolution&tool&AGGREGATION +Experience The initial deployment&early summer 2012&依赖 +Experience The initial deployment&collaborative review framework&AGGREGATION +analyst&capability&依赖 +analyst&system&依赖 +capability&system&AGGREGATION +consequence&iterative feedback loop&AGGREGATION +process&updated release&依赖 +process&occurring&依赖 +first few month&deployment&AGGREGATION +part&analyst user&AGGREGATION +suggestion&addition&依赖 +number&mouse click&AGGREGATION +suggestion&various metadata field&依赖 +suggestion&various metadata field&依赖 +addition&various metadata field&AGGREGATION +element&web portal view&AGGREGATION +visual organization&element&AGGREGATION +suggestion&addition&依赖 +time&writing&AGGREGATION +V-FASTR portal&system&依赖 +V-FASTR portal&time&依赖 +we&usefulness&依赖 +V-FASTR portal&several week&依赖 +we&early conclusion&依赖 +V-FASTR portal&portal&GENERALIZATION +V-FASTR portal&writing&依赖 +we&system&依赖 +usefulness&system&AGGREGATION +V-FASTR portal&usefulness&依赖 +project&broad goal&依赖 +project&radio-transient event&依赖 +project&collaborative task&依赖 +its&goal& +their&tasks& +scientist&task&依赖 +online availability&greater flexibility&依赖 +online availability&greater flexibility&依赖 +online availability&greater flexibility&依赖 +online availability®ard&依赖 +online availability®ard&依赖 +online availability®ard&依赖 +online availability&greater flexibility&依赖 +online availability&data and metada&AGGREGATION +online availability®ard&依赖 +totality&candidate data and metada&AGGREGATION +anecdotal account&analyst&AGGREGATION +number&feature request&AGGREGATION +evolution&framework&AGGREGATION +roadmap&sort&AGGREGATION +interaction&browser&依赖 +’ activity&transition&依赖 +’ activity&transition&依赖 +interaction&browser&依赖 +science team&three key feature&依赖 +timely review&remaining& +timely review&detection candidate&AGGREGATION +review job&moment&依赖 +review job&email&依赖 +review job&analyst&依赖 +prioritized list&analystʼs outstanding review task&AGGREGATION +presentation&prioritized list&AGGREGATION +one person&analysis&依赖 +it&analysis load&依赖 +one person&fulltime job&依赖 +equitable scheduling&future review job&AGGREGATION +analysis contribution&individual user&AGGREGATION +screen shot&initial version&AGGREGATION +initial version&web portal component&AGGREGATION +image metada&full metadata listing&依赖 +image metada&individual event candidate&依赖 +portal home page&recent job&依赖 +last step&associated raw datum&依赖 +analyst&a candidate event merit&依赖 +analyst&high-resolution followup&依赖 +it&later date&依赖 +analyst&NRAO machine&依赖 +certain defined activity&portal environment&依赖 +CONCLUSION V-FASTR&V-FASTR&GENERALIZATION +CONCLUSION V-FASTR&particularly challenging experiment&依赖 +data flow&ranging&依赖 +data flow&transport mechanism&依赖 +manual review&place&依赖 +manual review&analyst&依赖 +data flow&multiple physical location&依赖 +manual review&three continent )&依赖 +Various component&millisecond and hourly&依赖 +Various component&millisecond and hourly&依赖 +Various component&system&AGGREGATION +human expert&scheduled pattern recognition engine&依赖 +human expert&own role&依赖 +data processing component&addition&依赖 +human expert&overall architecture&依赖 +their&role& +datum&system&依赖 +V-FASTR portal&critical role&依赖 +effort&Jet Propulsion Laboratory&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&Computer-Based Medical Systems&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +Interoperable Data Architecture&et al. 2011&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&acm ) , 721 – 30 mattmann , c. , freeborn , d. , crichton , d. , et al. 2009&依赖 +A Software Architecture-based Framework&Software Engineering&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&space mission challenge&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&space mission challenge&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +npp sounder peate missions ( piscataway&space mission challenge&依赖 +npp sounder peate missions ( piscataway&space mission challenge&依赖 +npp sounder peate missions ( piscataway&Information Technology&依赖 +acm ) , 36 – 42 wayth , r. ,&2015 january hart et al&依赖 +2015 january hart et al&II International Workshop&AGGREGATION +acm ) , 36 – 42 wayth , r. ,&Software Engineering&依赖 +acm ) , 36 – 42 wayth , r. ,&2015 january hart et al&依赖 +acm ) , 36 – 42 wayth , r. ,&cloud computing ( new york&依赖 +acm ) , 36 – 42 wayth , r. ,&cloud computing ( new york&依赖 +acm ) , 36 – 42 wayth , r. ,&Software Engineering&依赖 +acm ) , 36 – 42 wayth , r. ,&II International Workshop&依赖 +acm ) , 36 – 42 wayth , r. ,&II International Workshop&依赖 +acm ) , 36 – 42 wayth , r. ,&II International Workshop&依赖 +acm ) , 36 – 42 wayth , r. ,&II International Workshop&依赖 +acm ) , 36 – 42 wayth , r. ,&cloud computing ( new york&依赖 +acm ) , 36 – 42 wayth , r. ,&2015 january hart et al&依赖 +acm ) , 36 – 42 wayth , r. ,&2015 january hart et al&依赖 +acm ) , 36 – 42 wayth , r. ,&Software Engineering&依赖 +acm ) , 36 – 42 wayth , r. ,&Software Engineering&依赖 +acm ) , 36 – 42 wayth , r. ,&cloud computing ( new york&依赖 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-simEnts.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-simEnts.txt new file mode 100644 index 0000000..0e25381 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-simEnts.txt @@ -0,0 +1,694 @@ +structs,structs +BooleanQueryCriteria,BooleanQueryCriteria +Element,Element +ExtractorSpec,ExtractorSpec +ExtractorSpec,spicified Extractor extractors +ExtractorSpec,MimeTypeExtractor +ExtractorSpec,CoreMetExtractor +ExtractorSpec,JobSpec +FileTransferStatus,FileTransferStatus +FileTransferStatus,File Manager extension points +FileTransferStatus,FileManagerDashboardNulled +FileTransferStatus,DevExtremeJavaScriptFile +FileTransferStatus,File Manager UI component +FileTransferStatus,File Manager server interface +FileTransferStatus,File Manager Command class +FileTransferStatus,File Manager web interface +FileTransferStatus,FileManagerAppUI +FileTransferStatus,File content +FileTransferStatus,JSXFile +FileTransferStatus,File Manager file System Provider +FileTransferStatus,File type +FileTransferStatus,File information +FreeTextQueryCriteria,FreeTextQueryCriteria +FreeTextQueryCriteria,FreePastry +FreeTextQueryCriteria,implementation Free +Product,Product +ProductPage,ProductPage +ProductPage,Product structures +ProductPage,ProductMetadata +ProductPage,ProductGenerationExecutives +ProductPage,ProductPctTransferred +ProductPage,ProductId +ProductPage,FileManagerPage +ProductPage,ProductTypes +ProductPage,ProductStructure +ProductPage,Product operation +ProductPage,Product instance information +ProductPage,Product listing pages +ProductType,ProductType +ProductType,Product structures +ProductType,ProductMetadata +ProductType,Type Script script +ProductType,ProductGenerationExecutives +ProductType,ProductPctTransferred +ProductType,ProductId +ProductType,ProductTypes +ProductType,ProductStructure +ProductType,Product operation +ProductType,Product instance information +ProductType,product Type +ProductType,Product listing pages +Query,Query +QueryCriteria,QueryCriteria +RangeQueryCriteria,RangeQueryCriteria +Reference,Reference +TermQueryCriteria,TermQueryCriteria +TestProduct,TestProduct +TestReference,TestReference +System,System +XmlRpcFileManager,XmlRpcFileManager +XmlRpcFileManager,import File Manager +XmlRpcFileManager,OpenFileManager +XmlRpcFileManager,XmlRpcFileManagerClient +XmlRpcFileManager,TrilloFileManager +XmlRpcFileManager,KendoUIFileManager +XmlRpcFileManager,Manager The Repository Manager extension +XmlRpcFileManager,ExtremeJavaScriptFileManager +XmlRpcFileManager,RepositoryManagerTheRepositoryManager +XmlRpcFileManager,CASFileManager +XmlRpcFileManager,Xml Rpc File Manager complex +XmlRpcFileManager,Manager extension point +XmlRpcFileManager,WebixFileManager +XmlRpcFileManager,bs4 File Manager +XmlRpcFileManager,ApacheOODTFileManager +XmlRpcFileManagerClient,XmlRpcFileManagerClient +XmlRpcFileManagerClient,Client implementation +XmlRpcFileManagerClient,Client React connector +XmlRpcFileManagerClient,Client React component +XmlRpcFileManagerClient,Client side metadata +XmlRpcFileManagerClient,MahasenClient +Dispatcher,Dispatcher +Result,Result +SecureWebServer,SecureWebServer +SecureWebServer,ApacheHTTPDWebServer +SecureWebServer,Server Node API v1 Localization +SecureWebServer,WindowsServer +Repository,Repository +RepositoryManager,RepositoryManager +RepositoryManager,SoftwarePackageManager +RepositoryManager,TaskManager +RepositoryManager,import File Manager +RepositoryManager,OpenFileManager +RepositoryManager,NETCoreFileManager +RepositoryManager,OODTCASFileManager +RepositoryManager,NodePackageManager +RepositoryManager,TrilloFileManager +RepositoryManager,KendoUIFileManager +RepositoryManager,WordPressFileManager +RepositoryManager,Manager The Repository Manager extension +RepositoryManager,ManagerIngestUseCase +RepositoryManager,ExtremeJavaScriptFileManager +RepositoryManager,Repository Manager extension point +RepositoryManager,RepositoryManagerTheRepositoryManager +RepositoryManager,RepositoryManagerTheRepositoryManager +RepositoryManager,CASFileManager +RepositoryManager,ManagerObjectModel +RepositoryManager,demand Library Manager +RepositoryManager,DeployTrilloFileManager +RepositoryManager,Manager extension point +RepositoryManager,WebixFileManager +RepositoryManager,bs4 File Manager +RepositoryManager,ApacheOODTFileManager +RepositoryManagerFactory,RepositoryManagerFactory +RepositoryManagerFactory,Repository Manager extension point +RepositoryManagerFactory,RepositoryManagerTheRepositoryManager +DataSourceRepositoryManager,DataSourceRepositoryManager +DataSourceRepositoryManager,SoftwarePackageManager +DataSourceRepositoryManager,Data nodes +DataSourceRepositoryManager,Manager control +DataSourceRepositoryManager,TaskManager +DataSourceRepositoryManager,import File Manager +DataSourceRepositoryManager,OpenFileManager +DataSourceRepositoryManager,NETCoreFileManager +DataSourceRepositoryManager,OODTCASFileManager +DataSourceRepositoryManager,NodePackageManager +DataSourceRepositoryManager,MoneydanceFinancialData +DataSourceRepositoryManager,Data Transfer interface +DataSourceRepositoryManager,Manager The Repository Manager extension +DataSourceRepositoryManager,Data products +DataSourceRepositoryManager,ExtremeJavaScriptFileManager +DataSourceRepositoryManager,ManagerArchitecture +DataSourceRepositoryManager,Data registry +DataSourceRepositoryManager,Manager catalog +DataSourceRepositoryManager,RepositoryManagerTheRepositoryManager +DataSourceRepositoryManager,CASFileManager +DataSourceRepositoryManager,ManagerObjectModel +DataSourceRepositoryManager,demand Library Manager +DataSourceRepositoryManager,Manager extension point +DataSourceRepositoryManager,WebixFileManager +DataSourceRepositoryManager,DataManagementSystems +DataSourceRepositoryManager,Data volume +DataSourceRepositoryManager,DataSystemDevelopment +DataSourceRepositoryManagerFactory,DataSourceRepositoryManagerFactory +DataSourceRepositoryManagerFactory,Data nodes +DataSourceRepositoryManagerFactory,MoneydanceFinancialData +DataSourceRepositoryManagerFactory,Data Transfer extension point +DataSourceRepositoryManagerFactory,Data Transfer interface +DataSourceRepositoryManagerFactory,Data products +DataSourceRepositoryManagerFactory,Data registry +DataSourceRepositoryManagerFactory,DataGridManagementSystem +DataSourceRepositoryManagerFactory,DataManagementSystems +DataSourceRepositoryManagerFactory,Data volume +DataSourceRepositoryManagerFactory,DataSystemDevelopment +ScienceDataRepositoryManager,ScienceDataRepositoryManager +ScienceDataRepositoryManager,SoftwarePackageManager +ScienceDataRepositoryManager,Manager control +ScienceDataRepositoryManager,TaskManager +ScienceDataRepositoryManager,import File Manager +ScienceDataRepositoryManager,OpenFileManager +ScienceDataRepositoryManager,NETCoreFileManager +ScienceDataRepositoryManager,OODTCASFileManager +ScienceDataRepositoryManager,SciencePgeConfigFileWriter +ScienceDataRepositoryManager,NodePackageManager +ScienceDataRepositoryManager,TrilloFileManager +ScienceDataRepositoryManager,KendoUIFileManager +ScienceDataRepositoryManager,WordPressFileManager +ScienceDataRepositoryManager,Manager The Repository Manager extension +ScienceDataRepositoryManager,ComputerScience +ScienceDataRepositoryManager,ExtremeJavaScriptFileManager +ScienceDataRepositoryManager,ManagerArchitecture +ScienceDataRepositoryManager,ScienceProduct +ScienceDataRepositoryManager,Manager catalog +ScienceDataRepositoryManager,RepositoryManagerTheRepositoryManager +ScienceDataRepositoryManager,CASFileManager +ScienceDataRepositoryManager,ManagerObjectModel +ScienceDataRepositoryManager,SpaceScience +ScienceDataRepositoryManager,demand Library Manager +ScienceDataRepositoryManager,DeployTrilloFileManager +ScienceDataRepositoryManager,Manager extension point +ScienceDataRepositoryManager,WebixFileManager +ScienceDataRepositoryManager,bs4 File Manager +ScienceDataRepositoryManager,ApacheOODTFileManager +ScienceDataRepositoryManagerFactory,ScienceDataRepositoryManagerFactory +ScienceDataRepositoryManagerFactory,ComputerScience +ScienceDataRepositoryManagerFactory,ScienceProduct +ScienceDataRepositoryManagerFactory,SpaceScience +ScienceDataRepositoryManagerFactory,ScienceDataProcessingSystems +TestXMLRepositoryManager,TestXMLRepositoryManager +TestXMLRepositoryManager,SoftwarePackageManager +TestXMLRepositoryManager,Manager control +TestXMLRepositoryManager,TaskManager +TestXMLRepositoryManager,import File Manager +TestXMLRepositoryManager,OpenFileManager +TestXMLRepositoryManager,NodePackageManager +TestXMLRepositoryManager,TrilloFileManager +TestXMLRepositoryManager,Manager The Repository Manager extension +TestXMLRepositoryManager,ExtremeJavaScriptFileManager +TestXMLRepositoryManager,ManagerArchitecture +TestXMLRepositoryManager,Manager catalog +TestXMLRepositoryManager,RepositoryManagerTheRepositoryManager +TestXMLRepositoryManager,CASFileManager +TestXMLRepositoryManager,ManagerObjectModel +TestXMLRepositoryManager,demand Library Manager +TestXMLRepositoryManager,Manager extension point +TestXMLRepositoryManager,WebixFileManager +TestXMLRepositoryManager,bs4 File Manager +XMLRepositoryManager,XMLRepositoryManager +XMLRepositoryManager,XMLMetadataConceptCatalog +XMLRepositoryManager,Manager control +XMLRepositoryManager,TaskManager +XMLRepositoryManager,import File Manager +XMLRepositoryManager,OpenFileManager +XMLRepositoryManager,NETCoreFileManager +XMLRepositoryManager,OODTCASFileManager +XMLRepositoryManager,XML files +XMLRepositoryManager,TrilloFileManager +XMLRepositoryManager,KendoUIFileManager +XMLRepositoryManager,WordPressFileManager +XMLRepositoryManager,Manager The Repository Manager extension +XMLRepositoryManager,ManagerIngestUseCase +XMLRepositoryManager,ExtremeJavaScriptFileManager +XMLRepositoryManager,ManagerArchitecture +XMLRepositoryManager,Manager catalog +XMLRepositoryManager,RepositoryManagerTheRepositoryManager +XMLRepositoryManager,CASFileManager +XMLRepositoryManager,DeployTrilloFileManager +XMLRepositoryManager,WebixFileManager +XMLRepositoryManager,bs4 File Manager +XMLRepositoryManager,ApacheOODTFileManager +XMLRepositoryManagerFactory,XMLRepositoryManagerFactory +XMLRepositoryManagerFactory,XML files +Metadata,Metadata +CoreMetKeys,CoreMetKeys +CoreMetKeys,Core machines +CoreMetKeys,CoreData +FileAttributesMetKeys,FileAttributesMetKeys +FileAttributesMetKeys,File Managers functionality +FileAttributesMetKeys,File Browser dialogs +FileAttributesMetKeys,FileRetrievalSystem +FileAttributesMetKeys,FileUploadComponent +FileAttributesMetKeys,DevExtremeJavaScriptFile +FileAttributesMetKeys,FileLocationExtractor +FileAttributesMetKeys,FilePctTransferred +FileAttributesMetKeys,File Repository layouts +FileAttributesMetKeys,File content +FileAttributesMetKeys,JSXFile +FileAttributesMetKeys,File type +ProductMetKeys,ProductMetKeys +ProductMetKeys,Product structures +ProductMetKeys,ProductMetadata +ProductMetKeys,ProductId +ProductMetKeys,ProductTypes +ProductMetKeys,ScienceProduct +ProductMetKeys,ProductStructure +ProductMetKeys,Product operation +FilemgrMetExtractor,FilemgrMetExtractor +FilemgrMetExtractor,CoreMetExtractor +AbstractFilemgrMetExtractor,AbstractFilemgrMetExtractor +AbstractFilemgrMetExtractor,MimeTypeExtractor +AbstractFilemgrMetExtractor,CoreMetExtractor +CoreMetExtractor,CoreMetExtractor +CoreMetExtractor,Core machines +CoreMetExtractor,Extractor extractors +CoreMetExtractor,MimeTypeExtractor +CoreMetExtractor,CoreData +TestAbstractFilemgrMetExtractor,TestAbstractFilemgrMetExtractor +TestAbstractFilemgrMetExtractor,Extractor extractors +TestAbstractFilemgrMetExtractor,MimeTypeExtractor +TestAbstractFilemgrMetExtractor,CoreMetExtractor +TestCoreMetExtractor,TestCoreMetExtractor +TestCoreMetExtractor,Extractor extractors +TestCoreMetExtractor,MimeTypeExtractor +TestCoreMetExtractor,CoreMetExtractor +Catalog,Catalog +CatalogFactory,CatalogFactory +DataSourceCatalog,DataSourceCatalog +DataSourceCatalog,XMLMetadataConceptCatalog +DataSourceCatalog,Data nodes +DataSourceCatalog,LuceneIndexCatalog +DataSourceCatalog,Catalog extension point interface +DataSourceCatalog,Data Transfer extension point +DataSourceCatalog,Data products +DataSourceCatalog,DataNodes +DataSourceCatalog,Data registry +DataSourceCatalog,CoreData +DataSourceCatalog,DataSystemPDS4InformationModel-Driven +DataSourceCatalog,LuceneCatalog +DataSourceCatalog,DataList +DataSourceCatalog,Catalog interface +DataSourceCatalog,GoddardEarthScienceData +DataSourceCatalog,DataStructure +DataSourceCatalog,DataGridManagementSystem +DataSourceCatalog,Data volume +DataSourceCatalogFactory,DataSourceCatalogFactory +DataSourceCatalogFactory,Data nodes +DataSourceCatalogFactory,DataIntensiveScientific +DataSourceCatalogFactory,MoneydanceFinancialData +DataSourceCatalogFactory,Data Transfer interface +DataSourceCatalogFactory,Data products +DataSourceCatalogFactory,DataNodes +DataSourceCatalogFactory,Data registry +DataSourceCatalogFactory,CoreData +DataSourceCatalogFactory,DataSystemPDS4InformationModel-Driven +DataSourceCatalogFactory,DataList +DataSourceCatalogFactory,DataStructure +DataSourceCatalogFactory,DataManagementSystems +DataSourceCatalogFactory,Data volume +DataSourceCatalogFactory,DataSystemDevelopment +LenientDataSourceCatalog,LenientDataSourceCatalog +LenientDataSourceCatalog,LuceneIndexCatalog +LenientDataSourceCatalog,AMGAMetadataCatalog +LenientDataSourceCatalog,Catalog extension point +LenientDataSourceCatalog,LuceneCatalog +LenientDataSourceCatalog,Catalog interface +LenientDataSourceCatalog,ApacheOODTCatalog +LuceneCatalog,LuceneCatalog +LuceneCatalog,XMLMetadataConceptCatalog +LuceneCatalog,LuceneIndexCatalog +LuceneCatalog,LuceneIndexCatalog +LuceneCatalog,AMGAMetadataCatalog +LuceneCatalog,Catalog extension point interface +LuceneCatalog,Catalog extension point +LuceneCatalog,ApacheOODTCatalog +LuceneCatalog,default Apache Lucene +LuceneCatalogFactory,LuceneCatalogFactory +LuceneCatalogFactory,LuceneCatalog +MappedDataSourceCatalog,MappedDataSourceCatalog +MappedDataSourceCatalog,LuceneIndexCatalog +MappedDataSourceCatalog,AMGAMetadataCatalog +MappedDataSourceCatalog,Catalog extension point +MappedDataSourceCatalog,LuceneCatalog +MappedDataSourceCatalog,Catalog interface +MappedDataSourceCatalog,ApacheOODTCatalog +MappedDataSourceCatalogFactory,MappedDataSourceCatalogFactory +MockCatalog,MockCatalog +MockCatalogFactory,MockCatalogFactory +ScienceDataCatalog,ScienceDataCatalog +ScienceDataCatalog,XMLMetadataConceptCatalog +ScienceDataCatalog,AMGAMetadataCatalog +ScienceDataCatalog,SciencePgeConfigFileWriter +ScienceDataCatalog,Catalog extension point interface +ScienceDataCatalog,ComputerScience +ScienceDataCatalog,ScienceProduct +ScienceDataCatalog,LuceneCatalog +ScienceDataCatalog,Catalog interface +ScienceDataCatalog,ApacheOODTCatalog +ScienceDataCatalog,SpaceScience +ScienceDataCatalog,ScienceDataProcessingSystems +ScienceDataCatalogFactory,ScienceDataCatalogFactory +ScienceDataCatalogFactory,SciencePgeConfigFileWriter +ScienceDataCatalogFactory,ComputerScience +ScienceDataCatalogFactory,ScienceProduct +ScienceDataCatalogFactory,SpaceScience +Catalog,Catalog +ProductIdGenerator,ProductIdGenerator +ProductIdGenerator,Product structures +ProductIdGenerator,ProductId +ProductIdGenerator,ProductTypes +ProductIdGenerator,ScienceProduct +ProductIdGenerator,ProductStructure +ProductIdGenerator,Product operation +ProductSerializer,ProductSerializer +CompleteProduct,CompleteProduct +CompleteProduct,ProductGenerationExecutives +CompleteProduct,ProductPctTransferred +CompleteProduct,ScienceProduct +CompleteProduct,Product instance information +CompleteProduct,Product listing pages +DefaultProductSerializer,DefaultProductSerializer +DefaultProductSerializer,Default configuration +NameProductIdGenerator,NameProductIdGenerator +NameProductIdGenerator,NameNode +Parameters,Parameters +QueryResponse,QueryResponse +SolrCatalog,SolrCatalog +SolrCatalogFactory,SolrCatalogFactory +SolrClient,SolrClient +UUIDProductIdGenerator,UUIDProductIdGenerator +Validation,Validation +ValidationLayer,ValidationLayer +ValidationLayer,ValidationLayerTheValidationLayer +ValidationLayer,ValidationLayerTheValidationLayer +ValidationLayer,Validation Layer extension point +ValidationLayer,Layer extension point +ValidationLayer,Layer The Validation Layer extension +ValidationLayerFactory,ValidationLayerFactory +ValidationLayerFactory,ValidationLayerTheValidationLayer +ValidationLayerFactory,Validation Layer extension point +DataSourceValidationLayer,DataSourceValidationLayer +DataSourceValidationLayer,Data nodes +DataSourceValidationLayer,DataIntensiveScientific +DataSourceValidationLayer,DataView +DataSourceValidationLayer,MoneydanceFinancialData +DataSourceValidationLayer,ValidationLayerTheValidationLayer +DataSourceValidationLayer,Data products +DataSourceValidationLayer,DataNodes +DataSourceValidationLayer,Data registry +DataSourceValidationLayer,CoreData +DataSourceValidationLayer,DataSystemPDS4InformationModel-Driven +DataSourceValidationLayer,DataList +DataSourceValidationLayer,DataSource +DataSourceValidationLayer,DataProtocols +DataSourceValidationLayer,Layer extension point +DataSourceValidationLayer,DataStructure +DataSourceValidationLayer,Layer The Validation Layer extension +DataSourceValidationLayer,DataGridManagementSystem +DataSourceValidationLayer,DataManagementSystems +DataSourceValidationLayer,Data volume +DataSourceValidationLayer,DataSystemDevelopment +DataSourceValidationLayerFactory,DataSourceValidationLayerFactory +DataSourceValidationLayerFactory,Data nodes +DataSourceValidationLayerFactory,DataIntensiveScientific +DataSourceValidationLayerFactory,DataView +DataSourceValidationLayerFactory,MoneydanceFinancialData +DataSourceValidationLayerFactory,Data Transfer extension point +DataSourceValidationLayerFactory,Data products +DataSourceValidationLayerFactory,DataNodes +DataSourceValidationLayerFactory,Data registry +DataSourceValidationLayerFactory,CoreData +DataSourceValidationLayerFactory,DataList +DataSourceValidationLayerFactory,GoddardEarthScienceData +DataSourceValidationLayerFactory,DataSource +DataSourceValidationLayerFactory,DataProtocols +DataSourceValidationLayerFactory,DataStructure +DataSourceValidationLayerFactory,DataGridManagementSystem +DataSourceValidationLayerFactory,DataManagementSystems +DataSourceValidationLayerFactory,Data volume +DataSourceValidationLayerFactory,DataSystemDevelopment +ScienceDataValidationLayer,ScienceDataValidationLayer +ScienceDataValidationLayer,SciencePgeConfigFileWriter +ScienceDataValidationLayer,ValidationLayerTheValidationLayer +ScienceDataValidationLayer,ComputerScience +ScienceDataValidationLayer,ScienceProduct +ScienceDataValidationLayer,GameScience +ScienceDataValidationLayer,SpaceScience +ScienceDataValidationLayer,Layer extension point +ScienceDataValidationLayer,ScienceDataProcessingSystems +ScienceDataValidationLayer,Layer The Validation Layer extension +ScienceDataValidationLayerFactory,ScienceDataValidationLayerFactory +ScienceDataValidationLayerFactory,ComputerScience +ScienceDataValidationLayerFactory,ScienceProduct +ScienceDataValidationLayerFactory,GameScience +ScienceDataValidationLayerFactory,SpaceScience +ScienceDataValidationLayerFactory,ScienceDataProcessingSystems +TestXMLValidationLayer,TestXMLValidationLayer +TestXMLValidationLayer,ValidationLayerTheValidationLayer +TestXMLValidationLayer,Layer extension point +TestXMLValidationLayer,Layer The Validation Layer extension +XMLValidationLayer,XMLValidationLayer +XMLValidationLayer,XMLMetadataConceptCatalog +XMLValidationLayer,XML files +XMLValidationLayer,ValidationLayerTheValidationLayer +XMLValidationLayer,XML Metadata Concept catalog +XMLValidationLayer,XML syntax +XMLValidationLayer,Layer The Validation Layer extension +XMLValidationLayerFactory,XMLValidationLayerFactory +XMLValidationLayerFactory,XML files +XMLValidationLayerFactory,XML syntax +versioning,versioning +Versioner,Versioner +Versioner,class AcquisitionDateVersioner +Versioner,class BasicVersioner +Versioner,class ConfigurableMetadataBasedFileVersioner +Versioner,class DateTimeVersioner +Versioner,class DirectoryProductVersioner +Versioner,class InPlaceVersioner +Versioner,class MetadataBasedFileVersioner +Versioner,class ProductTypeMetVersioner +Versioner,class SingleFileBasicVersioner +AcquisitionDateVersioner,AcquisitionDateVersioner +BasicVersioner,BasicVersioner +BasicVersioner,Versioner extension point +ConfigurableMetadataBasedFileVersioner,ConfigurableMetadataBasedFileVersioner +ConfigurableMetadataBasedFileVersioner,Versioner extension point +DateTimeVersioner,DateTimeVersioner +DirectoryProductVersioner,DirectoryProductVersioner +InPlaceVersioner,InPlaceVersioner +MetadataBasedFileVersioner,MetadataBasedFileVersioner +MetadataBasedFileVersioner,Versioner extension point +MetadataBasedFileVersioner,ProductMetadata +MetadataBasedFileVersioner,Metadata objects +MetadataBasedFileVersioner,Metadata information +MetadataBasedFileVersioner,Metadata management +ProductTypeMetVersioner,ProductTypeMetVersioner +ProductTypeMetVersioner,Versioner extension point +ProductTypeMetVersioner,Product structures +ProductTypeMetVersioner,ProductMetadata +ProductTypeMetVersioner,ProductGenerationExecutives +ProductTypeMetVersioner,ProductPctTransferred +ProductTypeMetVersioner,ProductId +ProductTypeMetVersioner,ProductTypes +ProductTypeMetVersioner,ScienceProduct +ProductTypeMetVersioner,ProductStructure +ProductTypeMetVersioner,Product operation +ProductTypeMetVersioner,Product instance information +ProductTypeMetVersioner,Product listing pages +SingleFileBasicVersioner,SingleFileBasicVersioner +SingleFileBasicVersioner,Versioner extension point +TestAcquisitionDateVersioner,TestAcquisitionDateVersioner +TestBasicVersioner,TestBasicVersioner +TestConfigurableMetadataBasedFileVersioner,TestConfigurableMetadataBasedFileVersioner +TestConfigurableMetadataBasedFileVersioner,Versioner extension point +TestDateTimeVersioner,TestDateTimeVersioner +TestDirectoryBasedProductVersioner,TestDirectoryBasedProductVersioner +TestDirectoryBasedProductVersioner,Versioner extension point +TestInPlaceVersioner,TestInPlaceVersioner +TestInPlaceVersioner,Versioner extension point +TestMetadataBasedFileVersioner,TestMetadataBasedFileVersioner +TestMetadataBasedFileVersioner,Versioner extension point +TestProductTypeMetVersioner,TestProductTypeMetVersioner +TestProductTypeMetVersioner,Versioner extension point +TestSingleFileBasicVersioner,TestSingleFileBasicVersioner +TestSingleFileBasicVersioner,Versioner extension point +VersioningUtils,VersioningUtils +ingest,ingest +Cache,Cache +CacheFactory,CacheFactory +Ingester,Ingester +RemoteableCache,RemoteableCache +AbstractCacheServerFactory,AbstractCacheServerFactory +CachedIngester,CachedIngester +CmdLineIngester,CmdLineIngester +LocalCache,LocalCache +LocalCacheFactory,LocalCacheFactory +RmiCache,RmiCache +RmiCacheFactory,RmiCacheFactory +RmiCacheServer,RmiCacheServer +RmiCacheServerFactory,RmiCacheServerFactory +StdIngester,StdIngester +TestCachedIngester,TestCachedIngester +TestLocalCache,TestLocalCache +TestRmiCache,TestRmiCache +TestStdIngester,TestStdIngester +datatransfer,datatransfer +DataTransfer,DataTransfer +DataTransfer,Data nodes +DataTransfer,DataIntensiveScientific +DataTransfer,LocalDataTransfer +DataTransfer,client Transfer +DataTransfer,MoneydanceFinancialData +DataTransfer,PlaceDataTransfer +DataTransfer,Data Transfer extension point +DataTransfer,Data Transfer interface +DataTransfer,Data products +DataTransfer,DataNodes +DataTransfer,RemoteDataTransfer +DataTransfer,Data registry +DataTransfer,DataSystemPDS4InformationModel-Driven +DataTransfer,DataList +DataTransfer,GoddardEarthScienceData +DataTransfer,DataStructure +DataTransfer,DataGridManagementSystem +DataTransfer,DataManagementSystems +DataTransfer,Data volume +DataTransfer,DataSystemDevelopment +DataTransferFactory,DataTransferFactory +DataTransferFactory,Data nodes +DataTransferFactory,Data Transfer extension point +DataTransferFactory,Data products +DataTransferFactory,DataNodes +DataTransferFactory,Data registry +DataTransferFactory,CoreData +DataTransferFactory,DataSystemPDS4InformationModel-Driven +DataTransferFactory,DataList +DataTransferFactory,GoddardEarthScienceData +DataTransferFactory,DataStructure +DataTransferFactory,DataGridManagementSystem +DataTransferFactory,Data volume +InPlaceDataTransferer,InPlaceDataTransferer +InPlaceDataTransferFactory,InPlaceDataTransferFactory +LocalDataTransferer,LocalDataTransferer +LocalDataTransferFactory,LocalDataTransferFactory +LocalDataTransferFactory,LocalDataTransfer +RemoteDataTransferer,RemoteDataTransferer +RemoteDataTransferer,RemoteFileSystemProvider +RemoteDataTransferFactory,RemoteDataTransferFactory +RemoteDataTransferFactory,RemoteDataTransfer +S3DataTransferer,S3DataTransferer +S3DataTransfererFactory,S3DataTransfererFactory +TestInPlaceDataTransferer,TestInPlaceDataTransferer +TestLocalDataTransferer,TestLocalDataTransferer +TestS3DataTransferer,TestS3DataTransferer +TestS3DataTransfererFactory,TestS3DataTransfererFactory +TransferStatusTracker,TransferStatusTracker +Cli,Cli +TestFileManagerCli,TestFileManagerCli +UseMockClientCmdLineActionStore,UseMockClientCmdLineActionStore +UseMockClientCmdLineActionStore,UseGit +UseMockClientCmdLineActionStore,Use npm +UseMockClientCmdLineActionStore,ElementStore +AbstractDeleteProductCliAction,AbstractDeleteProductCliAction +AbstractGetProductCliAction,AbstractGetProductCliAction +AbstractQueryCliAction,AbstractQueryCliAction +AddProductTypeCliAction,AddProductTypeCliAction +DeleteProductByIdCliAction,DeleteProductByIdCliAction +DeleteProductByNameCliAction,DeleteProductByNameCliAction +DumpMetadataCliAction,DumpMetadataCliAction +FileManagerCliAction,FileManagerCliAction +FileManagerCliAction,FileManagerAug +FileManagerCliAction,File Browser dialogs +FileManagerCliAction,FileManagerServer +FileManagerCliAction,FileManagerUsage +FileManagerCliAction,File Browser plugin +FileManagerCliAction,FileManagerPage +FileManagerCliAction,FileManagerManage +FileManagerCliAction,File Manager architecture +FileManagerCliAction,File Manager file System Provider +FileManagerCliAction,File information +FileManagerCliAction,File Manager loads +FileManagerCliAction,File Manager services +GetCurrentTransferCliAction,GetCurrentTransferCliAction +GetCurrentTransfersCliAction,GetCurrentTransfersCliAction +GetFilePercentTransferredCliAction,GetFilePercentTransferredCliAction +GetFirstPageCliAction,GetFirstPageCliAction +GetLastPageCliAction,GetLastPageCliAction +GetNextPageCliAction,GetNextPageCliAction +GetNumProductsCliAction,GetNumProductsCliAction +GetPrevPageCliAction,GetPrevPageCliAction +GetProductByIdCliAction,GetProductByIdCliAction +GetProductByNameCliAction,GetProductByNameCliAction +GetProductPercentTransferredCliAction,GetProductPercentTransferredCliAction +GetProductTypeByNameCliAction,GetProductTypeByNameCliAction +HasProductCliAction,HasProductCliAction +IngestProductCliAction,IngestProductCliAction +LuceneQueryCliAction,LuceneQueryCliAction +LuceneQueryCliAction,LuceneIndexCatalog +LuceneQueryCliAction,default Apache Lucene +RetrieveFilesCliAction,RetrieveFilesCliAction +SqlQueryCliAction,SqlQueryCliAction +Util,Util +Pagination,Pagination +DbStructFactory,DbStructFactory +GenericFileManagerObjectFactory,GenericFileManagerObjectFactory +QueryUtils,QueryUtils +SqlParser,SqlParser +TestGenericFileManagerObjectStructFactory,TestGenericFileManagerObjectStructFactory +TestXmlRpcStructFactory,TestXmlRpcStructFactory +TestXmlStructFactory,TestXmlStructFactory +XmlRpcStructFactory,XmlRpcStructFactory +XmlStructFactory,XmlStructFactory +tools,tools +CASAnalyzer,CASAnalyzer +CatalogSearch,CatalogSearch +CatalogSearch,XMLMetadataConceptCatalog +CatalogSearch,LuceneIndexCatalog +CatalogSearch,AMGAMetadataCatalog +CatalogSearch,Catalog extension point interface +CatalogSearch,Catalog extension point +CatalogSearch,Catalog interface +CatalogSearch,ApacheOODTCatalog +DeleteProduct,DeleteProduct +DeleteProduct,ProductGenerationExecutives +DeleteProduct,ProductPctTransferred +DeleteProduct,ScienceProduct +DeleteProduct,Product instance information +DeleteProduct,Product instance metadata +DumpDbElementsToXml,DumpDbElementsToXml +ExpImpCatalog,ExpImpCatalog +MetadataBasedProductMover,MetadataBasedProductMover +MetadataBasedProductMover,ProductMetadata +MetadataBasedProductMover,Metadata objects +MetadataBasedProductMover,Metadata information +MetadataBasedProductMover,Metadata management +MetadataBasedProductMover,custom PGE Metadata +MetadataBasedProductMover,Metadata generation +MetadataDumper,MetadataDumper +Metadata,class FileAttributesMetKeys +Metadata,class ProductMetKeys +Metadata,class FilemgrMetExtractor +Metadata,class AbstractFilemgrMetExtractor +Metadata,class CoreMetExtractor +Metadata,class CoreMetKeys +OptimizeLuceneCatalog,OptimizeLuceneCatalog +OptimizeLuceneCatalog,XMLMetadataConceptCatalog +OptimizeLuceneCatalog,Catalog extension point interface +OptimizeLuceneCatalog,LuceneCatalog +ProductDumper,ProductDumper +ProductTypeDocTool,ProductTypeDocTool +ProductTypeDocTool,Product structures +ProductTypeDocTool,ProductMetadata +ProductTypeDocTool,ProductGenerationExecutives +ProductTypeDocTool,QueryTool +ProductTypeDocTool,ProductPctTransferred +ProductTypeDocTool,ProductId +ProductTypeDocTool,ProductTypes +ProductTypeDocTool,ScienceProduct +ProductTypeDocTool,ProductStructure +ProductTypeDocTool,Product operation +ProductTypeDocTool,Product instance information +ProductTypeDocTool,Product listing pages +QueryTool,QueryTool +RangeQueryTester,RangeQueryTester +SolrIndexer,SolrIndexer +CliAction,CliAction diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-ziyan.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-ziyan.txt new file mode 100644 index 0000000..fa4a2de --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY-ziyan.txt @@ -0,0 +1,694 @@ +structs , structs +Boolean Query Criteria , Boolean Query Criteria +Element , Element +Extractor Spec , Extractor Spec +Extractor Spec , spicified Extractor extractors +Extractor Spec , Mime Type Extractor +Extractor Spec , Core Met Extractor +Extractor Spec , Job Spec +File Transfer Status , File Transfer Status +File Transfer Status , File Manager extension points +File Transfer Status , File Manager Dashboard Nulled +File Transfer Status , Dev Extreme Java Script File +File Transfer Status , File Manager UI component +File Transfer Status , File Manager server interface +File Transfer Status , File Manager Command class +File Transfer Status , File Manager web interface +File Transfer Status , File Manager App UI +File Transfer Status , File content +File Transfer Status , JSX File +File Transfer Status , File Manager file System Provider +File Transfer Status , File type +File Transfer Status , File information +Free Text Query Criteria , Free Text Query Criteria +Free Text Query Criteria , Free Pastry +Free Text Query Criteria , implementation Free +Product , Product +Product Page , Product Page +Product Page , Product structures +Product Page , Product Metadata +Product Page , Product Generation Executives +Product Page , Product Pct Transferred +Product Page , Product Id +Product Page , File Manager Page +Product Page , Product Types +Product Page , Product Structure +Product Page , Product operation +Product Page , Product instance information +Product Page , Product listing pages +Product Type , Product Type +Product Type , Product structures +Product Type , Product Metadata +Product Type , Type Script script +Product Type , Product Generation Executives +Product Type , Product Pct Transferred +Product Type , Product Id +Product Type , Product Types +Product Type , Product Structure +Product Type , Product operation +Product Type , Product instance information +Product Type , product Type +Product Type , Product listing pages +Query , Query +Query Criteria , Query Criteria +Range Query Criteria , Range Query Criteria +Reference , Reference +Term Query Criteria , Term Query Criteria +Test Product , Test Product +Test Reference , Test Reference +System , System +Xml Rpc File Manager , Xml Rpc File Manager +Xml Rpc File Manager , import File Manager +Xml Rpc File Manager , Open File Manager +Xml Rpc File Manager , Xml Rpc File Manager Client +Xml Rpc File Manager , Trillo File Manager +Xml Rpc File Manager , Kendo UI File Manager +Xml Rpc File Manager , Manager The Repository Manager extension +Xml Rpc File Manager , Extreme Java Script File Manager +Xml Rpc File Manager , Repository Manager The Repository Manager +Xml Rpc File Manager , CAS File Manager +Xml Rpc File Manager , Xml Rpc File Manager complex +Xml Rpc File Manager , Manager extension point +Xml Rpc File Manager , Webix File Manager +Xml Rpc File Manager , bs4 File Manager +Xml Rpc File Manager , Apache OODT File Manager +Xml Rpc File Manager Client , Xml Rpc File Manager Client +Xml Rpc File Manager Client , Client implementation +Xml Rpc File Manager Client , Client React connector +Xml Rpc File Manager Client , Client React component +Xml Rpc File Manager Client , Client side metadata +Xml Rpc File Manager Client , Mahasen Client +Dispatcher , Dispatcher +Result , Result +Secure Web Server , Secure Web Server +Secure Web Server , Apache HTTPD Web Server +Secure Web Server , Server Node API v1 Localization +Secure Web Server , Windows Server +Repository , Repository +Repository Manager , Repository Manager +Repository Manager , Software Package Manager +Repository Manager , Task Manager +Repository Manager , import File Manager +Repository Manager , Open File Manager +Repository Manager , NET Core File Manager +Repository Manager , OODT CAS File Manager +Repository Manager , Node Package Manager +Repository Manager , Trillo File Manager +Repository Manager , Kendo UI File Manager +Repository Manager , Word Press File Manager +Repository Manager , Manager The Repository Manager extension +Repository Manager , Manager Ingest Use Case +Repository Manager , Extreme Java Script File Manager +Repository Manager , Repository Manager extension point +Repository Manager , Repository Manager The Repository Manager +Repository Manager , Repository Manager The Repository Manager +Repository Manager , CAS File Manager +Repository Manager , Manager Object Model +Repository Manager , demand Library Manager +Repository Manager , Deploy Trillo File Manager +Repository Manager , Manager extension point +Repository Manager , Webix File Manager +Repository Manager , bs4 File Manager +Repository Manager , Apache OODT File Manager +Repository Manager Factory , Repository Manager Factory +Repository Manager Factory , Repository Manager extension point +Repository Manager Factory , Repository Manager The Repository Manager +Data Source Repository Manager , Data Source Repository Manager +Data Source Repository Manager , Software Package Manager +Data Source Repository Manager , Data nodes +Data Source Repository Manager , Manager control +Data Source Repository Manager , Task Manager +Data Source Repository Manager , import File Manager +Data Source Repository Manager , Open File Manager +Data Source Repository Manager , NET Core File Manager +Data Source Repository Manager , OODT CAS File Manager +Data Source Repository Manager , Node Package Manager +Data Source Repository Manager , Moneydance Financial Data +Data Source Repository Manager , Data Transfer interface +Data Source Repository Manager , Manager The Repository Manager extension +Data Source Repository Manager , Data products +Data Source Repository Manager , Extreme Java Script File Manager +Data Source Repository Manager , Manager Architecture +Data Source Repository Manager , Data registry +Data Source Repository Manager , Manager catalog +Data Source Repository Manager , Repository Manager The Repository Manager +Data Source Repository Manager , CAS File Manager +Data Source Repository Manager , Manager Object Model +Data Source Repository Manager , demand Library Manager +Data Source Repository Manager , Manager extension point +Data Source Repository Manager , Webix File Manager +Data Source Repository Manager , Data Management Systems +Data Source Repository Manager , Data volume +Data Source Repository Manager , Data System Development +Data Source Repository Manager Factory , Data Source Repository Manager Factory +Data Source Repository Manager Factory , Data nodes +Data Source Repository Manager Factory , Moneydance Financial Data +Data Source Repository Manager Factory , Data Transfer extension point +Data Source Repository Manager Factory , Data Transfer interface +Data Source Repository Manager Factory , Data products +Data Source Repository Manager Factory , Data registry +Data Source Repository Manager Factory , Data Grid Management System +Data Source Repository Manager Factory , Data Management Systems +Data Source Repository Manager Factory , Data volume +Data Source Repository Manager Factory , Data System Development +Science Data Repository Manager , Science Data Repository Manager +Science Data Repository Manager , Software Package Manager +Science Data Repository Manager , Manager control +Science Data Repository Manager , Task Manager +Science Data Repository Manager , import File Manager +Science Data Repository Manager , Open File Manager +Science Data Repository Manager , NET Core File Manager +Science Data Repository Manager , OODT CAS File Manager +Science Data Repository Manager , Science Pge Config File Writer +Science Data Repository Manager , Node Package Manager +Science Data Repository Manager , Trillo File Manager +Science Data Repository Manager , Kendo UI File Manager +Science Data Repository Manager , Word Press File Manager +Science Data Repository Manager , Manager The Repository Manager extension +Science Data Repository Manager , Computer Science +Science Data Repository Manager , Extreme Java Script File Manager +Science Data Repository Manager , Manager Architecture +Science Data Repository Manager , Science Product +Science Data Repository Manager , Manager catalog +Science Data Repository Manager , Repository Manager The Repository Manager +Science Data Repository Manager , CAS File Manager +Science Data Repository Manager , Manager Object Model +Science Data Repository Manager , Space Science +Science Data Repository Manager , demand Library Manager +Science Data Repository Manager , Deploy Trillo File Manager +Science Data Repository Manager , Manager extension point +Science Data Repository Manager , Webix File Manager +Science Data Repository Manager , bs4 File Manager +Science Data Repository Manager , Apache OODT File Manager +Science Data Repository Manager Factory , Science Data Repository Manager Factory +Science Data Repository Manager Factory , Computer Science +Science Data Repository Manager Factory , Science Product +Science Data Repository Manager Factory , Space Science +Science Data Repository Manager Factory , Science Data Processing Systems +Test XML Repository Manager , Test XML Repository Manager +Test XML Repository Manager , Software Package Manager +Test XML Repository Manager , Manager control +Test XML Repository Manager , Task Manager +Test XML Repository Manager , import File Manager +Test XML Repository Manager , Open File Manager +Test XML Repository Manager , Node Package Manager +Test XML Repository Manager , Trillo File Manager +Test XML Repository Manager , Manager The Repository Manager extension +Test XML Repository Manager , Extreme Java Script File Manager +Test XML Repository Manager , Manager Architecture +Test XML Repository Manager , Manager catalog +Test XML Repository Manager , Repository Manager The Repository Manager +Test XML Repository Manager , CAS File Manager +Test XML Repository Manager , Manager Object Model +Test XML Repository Manager , demand Library Manager +Test XML Repository Manager , Manager extension point +Test XML Repository Manager , Webix File Manager +Test XML Repository Manager , bs4 File Manager +XML Repository Manager , XML Repository Manager +XML Repository Manager , XML Metadata Concept Catalog +XML Repository Manager , Manager control +XML Repository Manager , Task Manager +XML Repository Manager , import File Manager +XML Repository Manager , Open File Manager +XML Repository Manager , NET Core File Manager +XML Repository Manager , OODT CAS File Manager +XML Repository Manager , XML files +XML Repository Manager , Trillo File Manager +XML Repository Manager , Kendo UI File Manager +XML Repository Manager , Word Press File Manager +XML Repository Manager , Manager The Repository Manager extension +XML Repository Manager , Manager Ingest Use Case +XML Repository Manager , Extreme Java Script File Manager +XML Repository Manager , Manager Architecture +XML Repository Manager , Manager catalog +XML Repository Manager , Repository Manager The Repository Manager +XML Repository Manager , CAS File Manager +XML Repository Manager , Deploy Trillo File Manager +XML Repository Manager , Webix File Manager +XML Repository Manager , bs4 File Manager +XML Repository Manager , Apache OODT File Manager +XML Repository Manager Factory , XML Repository Manager Factory +XML Repository Manager Factory , XML files +Metadata , Metadata +Core Met Keys , Core Met Keys +Core Met Keys , Core machines +Core Met Keys , Core Data +File Attributes Met Keys , File Attributes Met Keys +File Attributes Met Keys , File Managers functionality +File Attributes Met Keys , File Browser dialogs +File Attributes Met Keys , File Retrieval System +File Attributes Met Keys , File Upload Component +File Attributes Met Keys , Dev Extreme Java Script File +File Attributes Met Keys , File Location Extractor +File Attributes Met Keys , File Pct Transferred +File Attributes Met Keys , File Repository layouts +File Attributes Met Keys , File content +File Attributes Met Keys , JSX File +File Attributes Met Keys , File type +Product Met Keys , Product Met Keys +Product Met Keys , Product structures +Product Met Keys , Product Metadata +Product Met Keys , Product Id +Product Met Keys , Product Types +Product Met Keys , Science Product +Product Met Keys , Product Structure +Product Met Keys , Product operation +Filemgr Met Extractor , Filemgr Met Extractor +Filemgr Met Extractor , Core Met Extractor +Abstract Filemgr Met Extractor , Abstract Filemgr Met Extractor +Abstract Filemgr Met Extractor , Mime Type Extractor +Abstract Filemgr Met Extractor , Core Met Extractor +Core Met Extractor , Core Met Extractor +Core Met Extractor , Core machines +Core Met Extractor , Extractor extractors +Core Met Extractor , Mime Type Extractor +Core Met Extractor , Core Data +Test Abstract Filemgr Met Extractor , Test Abstract Filemgr Met Extractor +Test Abstract Filemgr Met Extractor , Extractor extractors +Test Abstract Filemgr Met Extractor , Mime Type Extractor +Test Abstract Filemgr Met Extractor , Core Met Extractor +Test Core Met Extractor , Test Core Met Extractor +Test Core Met Extractor , Extractor extractors +Test Core Met Extractor , Mime Type Extractor +Test Core Met Extractor , Core Met Extractor +Catalog , Catalog +Catalog Factory , Catalog Factory +Data Source Catalog , Data Source Catalog +Data Source Catalog , XML Metadata Concept Catalog +Data Source Catalog , Data nodes +Data Source Catalog , Lucene Index Catalog +Data Source Catalog , Catalog extension point interface +Data Source Catalog , Data Transfer extension point +Data Source Catalog , Data products +Data Source Catalog , Data Nodes +Data Source Catalog , Data registry +Data Source Catalog , Core Data +Data Source Catalog , Data System PDS4 Information Model-Driven +Data Source Catalog , Lucene Catalog +Data Source Catalog , Data List +Data Source Catalog , Catalog interface +Data Source Catalog , Goddard Earth Science Data +Data Source Catalog , Data Structure +Data Source Catalog , Data Grid Management System +Data Source Catalog , Data volume +Data Source Catalog Factory , Data Source Catalog Factory +Data Source Catalog Factory , Data nodes +Data Source Catalog Factory , Data Intensive Scientific +Data Source Catalog Factory , Moneydance Financial Data +Data Source Catalog Factory , Data Transfer interface +Data Source Catalog Factory , Data products +Data Source Catalog Factory , Data Nodes +Data Source Catalog Factory , Data registry +Data Source Catalog Factory , Core Data +Data Source Catalog Factory , Data System PDS4 Information Model-Driven +Data Source Catalog Factory , Data List +Data Source Catalog Factory , Data Structure +Data Source Catalog Factory , Data Management Systems +Data Source Catalog Factory , Data volume +Data Source Catalog Factory , Data System Development +Lenient Data Source Catalog , Lenient Data Source Catalog +Lenient Data Source Catalog , Lucene Index Catalog +Lenient Data Source Catalog , AMGA Metadata Catalog +Lenient Data Source Catalog , Catalog extension point +Lenient Data Source Catalog , Lucene Catalog +Lenient Data Source Catalog , Catalog interface +Lenient Data Source Catalog , Apache OODT Catalog +Lucene Catalog , Lucene Catalog +Lucene Catalog , XML Metadata Concept Catalog +Lucene Catalog , Lucene Index Catalog +Lucene Catalog , Lucene Index Catalog +Lucene Catalog , AMGA Metadata Catalog +Lucene Catalog , Catalog extension point interface +Lucene Catalog , Catalog extension point +Lucene Catalog , Apache OODT Catalog +Lucene Catalog , default Apache Lucene +Lucene Catalog Factory , Lucene Catalog Factory +Lucene Catalog Factory , Lucene Catalog +Mapped Data Source Catalog , Mapped Data Source Catalog +Mapped Data Source Catalog , Lucene Index Catalog +Mapped Data Source Catalog , AMGA Metadata Catalog +Mapped Data Source Catalog , Catalog extension point +Mapped Data Source Catalog , Lucene Catalog +Mapped Data Source Catalog , Catalog interface +Mapped Data Source Catalog , Apache OODT Catalog +Mapped Data Source Catalog Factory , Mapped Data Source Catalog Factory +Mock Catalog , Mock Catalog +Mock Catalog Factory , Mock Catalog Factory +Science Data Catalog , Science Data Catalog +Science Data Catalog , XML Metadata Concept Catalog +Science Data Catalog , AMGA Metadata Catalog +Science Data Catalog , Science Pge Config File Writer +Science Data Catalog , Catalog extension point interface +Science Data Catalog , Computer Science +Science Data Catalog , Science Product +Science Data Catalog , Lucene Catalog +Science Data Catalog , Catalog interface +Science Data Catalog , Apache OODT Catalog +Science Data Catalog , Space Science +Science Data Catalog , Science Data Processing Systems +Science Data Catalog Factory , Science Data Catalog Factory +Science Data Catalog Factory , Science Pge Config File Writer +Science Data Catalog Factory , Computer Science +Science Data Catalog Factory , Science Product +Science Data Catalog Factory , Space Science +Catalog , Catalog +Product Id Generator , Product Id Generator +Product Id Generator , Product structures +Product Id Generator , Product Id +Product Id Generator , Product Types +Product Id Generator , Science Product +Product Id Generator , Product Structure +Product Id Generator , Product operation +Product Serializer , Product Serializer +Complete Product , Complete Product +Complete Product , Product Generation Executives +Complete Product , Product Pct Transferred +Complete Product , Science Product +Complete Product , Product instance information +Complete Product , Product listing pages +Default Product Serializer , Default Product Serializer +Default Product Serializer , Default configuration +Name Product Id Generator , Name Product Id Generator +Name Product Id Generator , Name Node +Parameters , Parameters +Query Response , Query Response +Solr Catalog , Solr Catalog +Solr Catalog Factory , Solr Catalog Factory +Solr Client , Solr Client +UUID Product Id Generator , UUID Product Id Generator +Validation , Validation +Validation Layer , Validation Layer +Validation Layer , Validation Layer The Validation Layer +Validation Layer , Validation Layer The Validation Layer +Validation Layer , Validation Layer extension point +Validation Layer , Layer extension point +Validation Layer , Layer The Validation Layer extension +Validation Layer Factory , Validation Layer Factory +Validation Layer Factory , Validation Layer The Validation Layer +Validation Layer Factory , Validation Layer extension point +Data Source Validation Layer , Data Source Validation Layer +Data Source Validation Layer , Data nodes +Data Source Validation Layer , Data Intensive Scientific +Data Source Validation Layer , Data View +Data Source Validation Layer , Moneydance Financial Data +Data Source Validation Layer , Validation Layer The Validation Layer +Data Source Validation Layer , Data products +Data Source Validation Layer , Data Nodes +Data Source Validation Layer , Data registry +Data Source Validation Layer , Core Data +Data Source Validation Layer , Data System PDS4 Information Model-Driven +Data Source Validation Layer , Data List +Data Source Validation Layer , Data Source +Data Source Validation Layer , Data Protocols +Data Source Validation Layer , Layer extension point +Data Source Validation Layer , Data Structure +Data Source Validation Layer , Layer The Validation Layer extension +Data Source Validation Layer , Data Grid Management System +Data Source Validation Layer , Data Management Systems +Data Source Validation Layer , Data volume +Data Source Validation Layer , Data System Development +Data Source Validation Layer Factory , Data Source Validation Layer Factory +Data Source Validation Layer Factory , Data nodes +Data Source Validation Layer Factory , Data Intensive Scientific +Data Source Validation Layer Factory , Data View +Data Source Validation Layer Factory , Moneydance Financial Data +Data Source Validation Layer Factory , Data Transfer extension point +Data Source Validation Layer Factory , Data products +Data Source Validation Layer Factory , Data Nodes +Data Source Validation Layer Factory , Data registry +Data Source Validation Layer Factory , Core Data +Data Source Validation Layer Factory , Data List +Data Source Validation Layer Factory , Goddard Earth Science Data +Data Source Validation Layer Factory , Data Source +Data Source Validation Layer Factory , Data Protocols +Data Source Validation Layer Factory , Data Structure +Data Source Validation Layer Factory , Data Grid Management System +Data Source Validation Layer Factory , Data Management Systems +Data Source Validation Layer Factory , Data volume +Data Source Validation Layer Factory , Data System Development +Science Data Validation Layer , Science Data Validation Layer +Science Data Validation Layer , Science Pge Config File Writer +Science Data Validation Layer , Validation Layer The Validation Layer +Science Data Validation Layer , Computer Science +Science Data Validation Layer , Science Product +Science Data Validation Layer , Game Science +Science Data Validation Layer , Space Science +Science Data Validation Layer , Layer extension point +Science Data Validation Layer , Science Data Processing Systems +Science Data Validation Layer , Layer The Validation Layer extension +Science Data Validation Layer Factory , Science Data Validation Layer Factory +Science Data Validation Layer Factory , Computer Science +Science Data Validation Layer Factory , Science Product +Science Data Validation Layer Factory , Game Science +Science Data Validation Layer Factory , Space Science +Science Data Validation Layer Factory , Science Data Processing Systems +Test XML Validation Layer , Test XML Validation Layer +Test XML Validation Layer , Validation Layer The Validation Layer +Test XML Validation Layer , Layer extension point +Test XML Validation Layer , Layer The Validation Layer extension +XML Validation Layer , XML Validation Layer +XML Validation Layer , XML Metadata Concept Catalog +XML Validation Layer , XML files +XML Validation Layer , Validation Layer The Validation Layer +XML Validation Layer , XML Metadata Concept catalog +XML Validation Layer , XML syntax +XML Validation Layer , Layer The Validation Layer extension +XML Validation Layer Factory , XML Validation Layer Factory +XML Validation Layer Factory , XML files +XML Validation Layer Factory , XML syntax +versioning , versioning +Versioner , Versioner +Versioner , class Acquisition Date Versioner +Versioner , class Basic Versioner +Versioner , class Configurable Metadata Based File Versioner +Versioner , class Date Time Versioner +Versioner , class Directory Product Versioner +Versioner , class In Place Versioner +Versioner , class Metadata Based File Versioner +Versioner , class Product Type Met Versioner +Versioner , class Single File Basic Versioner +Acquisition Date Versioner , Acquisition Date Versioner +Basic Versioner , Basic Versioner +Basic Versioner , Versioner extension point +Configurable Metadata Based File Versioner , Configurable Metadata Based File Versioner +Configurable Metadata Based File Versioner , Versioner extension point +Date Time Versioner , Date Time Versioner +Directory Product Versioner , Directory Product Versioner +In Place Versioner , In Place Versioner +Metadata Based File Versioner , Metadata Based File Versioner +Metadata Based File Versioner , Versioner extension point +Metadata Based File Versioner , Product Metadata +Metadata Based File Versioner , Metadata objects +Metadata Based File Versioner , Metadata information +Metadata Based File Versioner , Metadata management +Product Type Met Versioner , Product Type Met Versioner +Product Type Met Versioner , Versioner extension point +Product Type Met Versioner , Product structures +Product Type Met Versioner , Product Metadata +Product Type Met Versioner , Product Generation Executives +Product Type Met Versioner , Product Pct Transferred +Product Type Met Versioner , Product Id +Product Type Met Versioner , Product Types +Product Type Met Versioner , Science Product +Product Type Met Versioner , Product Structure +Product Type Met Versioner , Product operation +Product Type Met Versioner , Product instance information +Product Type Met Versioner , Product listing pages +Single File Basic Versioner , Single File Basic Versioner +Single File Basic Versioner , Versioner extension point +Test Acquisition Date Versioner , Test Acquisition Date Versioner +Test Basic Versioner , Test Basic Versioner +Test Configurable Metadata Based File Versioner , Test Configurable Metadata Based File Versioner +Test Configurable Metadata Based File Versioner , Versioner extension point +Test Date Time Versioner , Test Date Time Versioner +Test Directory Based Product Versioner , Test Directory Based Product Versioner +Test Directory Based Product Versioner , Versioner extension point +Test In Place Versioner , Test In Place Versioner +Test In Place Versioner , Versioner extension point +Test Metadata Based File Versioner , Test Metadata Based File Versioner +Test Metadata Based File Versioner , Versioner extension point +Test Product Type Met Versioner , Test Product Type Met Versioner +Test Product Type Met Versioner , Versioner extension point +Test Single File Basic Versioner , Test Single File Basic Versioner +Test Single File Basic Versioner , Versioner extension point +Versioning Utils , Versioning Utils +ingest , ingest +Cache , Cache +Cache Factory , Cache Factory +Ingester , Ingester +Remoteable Cache , Remoteable Cache +Abstract Cache Server Factory , Abstract Cache Server Factory +Cached Ingester , Cached Ingester +CmdLine Ingester , CmdLine Ingester +Local Cache , Local Cache +Local Cache Factory , Local Cache Factory +Rmi Cache , Rmi Cache +Rmi Cache Factory , Rmi Cache Factory +Rmi Cache Server , Rmi Cache Server +Rmi Cache Server Factory , Rmi Cache Server Factory +Std Ingester , Std Ingester +Test Cached Ingester , Test Cached Ingester +Test Local Cache , Test Local Cache +Test Rmi Cache , Test Rmi Cache +Test Std Ingester , Test Std Ingester +datatransfer , datatransfer +Data Transfer , Data Transfer +Data Transfer , Data nodes +Data Transfer , Data Intensive Scientific +Data Transfer , Local Data Transfer +Data Transfer , client Transfer +Data Transfer , Moneydance Financial Data +Data Transfer , Place Data Transfer +Data Transfer , Data Transfer extension point +Data Transfer , Data Transfer interface +Data Transfer , Data products +Data Transfer , Data Nodes +Data Transfer , Remote Data Transfer +Data Transfer , Data registry +Data Transfer , Data System PDS4 Information Model-Driven +Data Transfer , Data List +Data Transfer , Goddard Earth Science Data +Data Transfer , Data Structure +Data Transfer , Data Grid Management System +Data Transfer , Data Management Systems +Data Transfer , Data volume +Data Transfer , Data System Development +Data Transfer Factory , Data Transfer Factory +Data Transfer Factory , Data nodes +Data Transfer Factory , Data Transfer extension point +Data Transfer Factory , Data products +Data Transfer Factory , Data Nodes +Data Transfer Factory , Data registry +Data Transfer Factory , Core Data +Data Transfer Factory , Data System PDS4 Information Model-Driven +Data Transfer Factory , Data List +Data Transfer Factory , Goddard Earth Science Data +Data Transfer Factory , Data Structure +Data Transfer Factory , Data Grid Management System +Data Transfer Factory , Data volume +In Place Data Transferer , In Place Data Transferer +In Place Data Transfer Factory , In Place Data Transfer Factory +Local Data Transferer , Local Data Transferer +Local Data Transfer Factory , Local Data Transfer Factory +Local Data Transfer Factory , Local Data Transfer +Remote Data Transferer , Remote Data Transferer +Remote Data Transferer , Remote File System Provider +Remote Data Transfer Factory , Remote Data Transfer Factory +Remote Data Transfer Factory , Remote Data Transfer +S3Data Transferer , S3Data Transferer +S3Data Transferer Factory , S3Data Transferer Factory +Test In Place Data Transferer , Test In Place Data Transferer +Test Local Data Transferer , Test Local Data Transferer +Test S3 Data Transferer , Test S3 Data Transferer +Test S3 Data Transferer Factory , Test S3 Data Transferer Factory +Transfer Status Tracker , Transfer Status Tracker +Cli , Cli +Test File Manager Cli , Test File Manager Cli +Use Mock Client Cmd Line Action Store , Use Mock Client Cmd Line Action Store +Use Mock Client Cmd Line Action Store , Use Git +Use Mock Client Cmd Line Action Store , Use npm +Use Mock Client Cmd Line Action Store , Element Store +Abstract Delete Product Cli Action , Abstract Delete Product Cli Action +Abstract Get Product Cli Action , Abstract Get Product Cli Action +Abstract Query Cli Action , Abstract Query Cli Action +Add Product Type Cli Action , Add Product Type Cli Action +Delete Product By Id Cli Action , Delete Product By Id Cli Action +Delete Product By Name Cli Action , Delete Product By Name Cli Action +Dump Metadata Cli Action , Dump Metadata Cli Action +File Manager Cli Action , File Manager Cli Action +File Manager Cli Action , File Manager Aug +File Manager Cli Action , File Browser dialogs +File Manager Cli Action , File Manager Server +File Manager Cli Action , File Manager Usage +File Manager Cli Action , File Browser plugin +File Manager Cli Action , File Manager Page +File Manager Cli Action , File Manager Manage +File Manager Cli Action , File Manager architecture +File Manager Cli Action , File Manager file System Provider +File Manager Cli Action , File information +File Manager Cli Action , File Manager loads +File Manager Cli Action , File Manager services +Get Current Transfer Cli Action , Get Current Transfer Cli Action +Get Current Transfers Cli Action , Get Current Transfers Cli Action +Get File Percent Transferred Cli Action , Get File Percent Transferred Cli Action +Get First Page Cli Action , Get First Page Cli Action +Get Last Page Cli Action , Get Last Page Cli Action +Get Next Page Cli Action , Get Next Page Cli Action +Get Num Products Cli Action , Get Num Products Cli Action +Get Prev Page Cli Action , Get Prev Page Cli Action +Get Product By Id Cli Action , Get Product By Id Cli Action +Get Product By Name Cli Action , Get Product By Name Cli Action +Get Product Percent Transferred Cli Action , Get Product Percent Transferred Cli Action +Get Product Type By Name Cli Action , Get Product Type By Name Cli Action +Has Product Cli Action , Has Product Cli Action +Ingest Product Cli Action , Ingest Product Cli Action +Lucene Query Cli Action , Lucene Query Cli Action +Lucene Query Cli Action , Lucene Index Catalog +Lucene Query Cli Action , default Apache Lucene +Retrieve Files Cli Action , Retrieve Files Cli Action +Sql Query Cli Action , Sql Query Cli Action +Util , Util +Pagination , Pagination +Db Struct Factory , Db Struct Factory +Generic File Manager Object Factory , Generic File Manager Object Factory +Query Utils , Query Utils +Sql Parser , Sql Parser +Test Generic File Manager Object Struct Factory , Test Generic File Manager Object Struct Factory +Test Xml Rpc Struct Factory , Test Xml Rpc Struct Factory +Test Xml Struct Factory , Test Xml Struct Factory +Xml Rpc Struct Factory , Xml Rpc Struct Factory +Xml Struct Factory , Xml Struct Factory +tools , tools +CAS Analyzer , CAS Analyzer +Catalog Search , Catalog Search +Catalog Search , XML Metadata Concept Catalog +Catalog Search , Lucene Index Catalog +Catalog Search , AMGA Metadata Catalog +Catalog Search , Catalog extension point interface +Catalog Search , Catalog extension point +Catalog Search , Catalog interface +Catalog Search , Apache OODT Catalog +Delete Product , Delete Product +Delete Product , Product Generation Executives +Delete Product , Product Pct Transferred +Delete Product , Science Product +Delete Product , Product instance information +Delete Product , Product instance metadata +Dump Db Elements To Xml , Dump Db Elements To Xml +ExpImp Catalog , ExpImp Catalog +Metadata Based Product Mover , Metadata Based Product Mover +Metadata Based Product Mover , Product Metadata +Metadata Based Product Mover , Metadata objects +Metadata Based Product Mover , Metadata information +Metadata Based Product Mover , Metadata management +Metadata Based Product Mover , custom PGE Metadata +Metadata Based Product Mover , Metadata generation +Metadata Dumper , Metadata Dumper +Metadata , class File Attributes Met Keys +Metadata , class Product Met Keys +Metadata , class Filemgr Met Extractor +Metadata , class Abstract Filemgr Met Extractor +Metadata , class Core Met Extractor +Metadata , class Core Met Keys +Optimize Lucene Catalog , Optimize Lucene Catalog +Optimize Lucene Catalog , XML Metadata Concept Catalog +Optimize Lucene Catalog , Catalog extension point interface +Optimize Lucene Catalog , Lucene Catalog +Product Dumper , Product Dumper +Product Type Doc Tool , Product Type Doc Tool +Product Type Doc Tool , Product structures +Product Type Doc Tool , Product Metadata +Product Type Doc Tool , Product Generation Executives +Product Type Doc Tool , Query Tool +Product Type Doc Tool , Product Pct Transferred +Product Type Doc Tool , Product Id +Product Type Doc Tool , Product Types +Product Type Doc Tool , Science Product +Product Type Doc Tool , Product Structure +Product Type Doc Tool , Product operation +Product Type Doc Tool , Product instance information +Product Type Doc Tool , Product listing pages +Query Tool , Query Tool +Range Query Tester , Range Query Tester +Solr Indexer , Solr Indexer +Cli Action , Cli Action \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt new file mode 100644 index 0000000..c92ae47 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt @@ -0,0 +1,637 @@ +A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE +STREAMS: THE V-FASTR EXPERIMENT AS A CASE STUDY +Andrew F. Hart, Luca Cinquini, Shakeh E. Khudikyan, David R. Thompson, +Chris A. Mattmann, Kiri Wagstaff, Joseph Lazio, and Dayton Jones +Jet Propulsion Laboratory, California Institute of Technology, Pasadena, CA 91109, USA; andrew.f.hart@jpl.nasa.gov +Received 2014 March 24; accepted 2014 August 10; published 2014 December 16 +ABSTRACT +“Fast radio transients” are defined here as bright millisecond pulses of radio-frequency energy. These shortduration +pulses can be produced by known objects such as pulsars or potentially by more exotic objects such as +evaporating black holes. The identification and verification of such an event would be of great scientific value. This +is one major goal of the Very Long Baseline Array (VLBA) Fast Transient Experiment (V-FASTR), a softwarebased +detection system installed at the VLBA. V-FASTR uses a “commensal” (piggy-back) approach, analyzing +all array data continually during routine VLBA observations and identifying candidate fast transient events. Raw +data can be stored from a buffer memory, which enables a comprehensive off-line analysis. This is invaluable for +validating the astrophysical origin of any detection. Candidates discovered by the automatic system must be +reviewed each day by analysts to identify any promising signals that warrant a more in-depth investigation. To +support the timely analysis of fast transient detection candidates by V-FASTR scientists, we have developed a +metadata-driven, collaborative candidate review framework. The framework consists of a software pipeline for +metadata processing composed of both open source software components and project-specific code written +expressly to extract and catalog metadata from the incoming V-FASTR data products, and a web-based data portal +that facilitates browsing and inspection of the available metadata for candidate events extracted from the VLBA +radio data. +Key words: catalogs – methods: data analysis – pulsars: general – radio continuum: general +1. INTRODUCTION +One of the current primary goals of radio astronomy is to +explore and understand the “dynamic radio sky” (Cordes +et al. 2004). In contrast to generating catalogs of known +sources, this scientific thrust focuses on transient events, or +transient signals generated by persistent yet time-varying +sources. We do not yet fully understand the scope and +distribution of different transient sources, which range from +the known (e.g., active galactic nuclei, brown dwarfs, flare +stars, X-ray binaries, supernovae, gamma-ray bursts) to the +probable (e.g., exoplanets), to the possible (e.g., ET +civilizations, annihilating black holes). As noted by Cordes +et al. (2004, p.14), “most exciting would be the discovery of +new classes of sources” (italics in original). Radio telescopes +continue to increase their data collecting abilities, observing +the sky with progressively finer time resolution. Of current +particular interest is the detection and characterization of +“fast radio transients,” which last for only small fractions of a +second. +The V-FASTR experiment (Wayth et al. 2011) is one of a +new breed of radio astronomy experiments specifically +targeting fast transient radio signals. The experiment is +conducted in a fully commensal (passive) fashion, searching +for signals in the data gathered during the regular processing +activities of its host instrument. Unlike more traditional, +single-telescope observations, however, the V-FASTR +experiment simultaneously utilizes anywhere between 2 and +10 telescopes of the National Radio Astronomy Observatory +ʼs (NRAO) Very Long Baseline Array (VLBA) (Romney +2010). The VLBA consists of 10 25 m telescopes that are +positioned geographically such that no 2 are within each +otherʼs local horizon, and the V-FASTR experiment +leverages this configuration to better discriminate between +instances of terrestrial Radio Frequency Interference (RFI) +and potentially genuine astronomical pulses (Thompson +et al. 2011). +The huge volumes of raw time-series voltage data generated +by the VLBA in the course of its operation make storing the +full record of an entire observing session infeasible at the +present time. As a consequence, considerable effort has been +devoted to developing and fine-tuning algorithms for the realtime +identification of potentially interesting signals in the noisy +and often incomplete data (Thompson et al. 2011; Wayth et al. +2012). All data selected by the real-time processing step is +subsequently inspected, on a daily basis, by members of the +geographically distributed V-FASTR science team and either +discarded as spurious or archived offline for full analysis at a +later date. +The V-FASTR experiment must therefore operate within +several important resource constraints: the inability to archive +the full observational record due to space constraints, and a +practical workload constraint upon the human analysts +reviewing candidate detections. To address the latter, we have +developed a metadata-driven, collaborative candidate review +framework for the V-FASTR experiment. The framework +comprises a set of software components dedicated to the +automatic capture and organization of metadata describing the +candidate events identified as interesting by the automated +algorithms, and an online environment for the collaborative +perusal and inspection of related imagery data by the V-FASTR +analysis team. +The rest of this paper describes the system as follows. In +Section 2 we describe our project in a more general context. +Section 3 presents the methodology and an architectural +description of the system. We follow with an evaluation of +The Astronomical Journal, 149:23 (7pp), 2015 January doi:10.1088/0004-6256/149/1/23 +© 2015. The American Astronomical Society. All rights reserved. +1 +our experience deploying the framework in Section 4, and +offer conclusions and future directions for the work in +Section 5. +2. BACKGROUND +To better understand the context of the system implementation +presented in Section 3, we first briefly introduce the VFASTR +experiment and describe the development of scientific +data systems at the NASA Jet Propulsion Laboratory (JPL). +We then describe the Object Oriented Data Technology +(OODT) project, an open source information integration +platform that plays a central role in our framework. Finally, +we briefly touch upon several related efforts at developing +online tools to collaboratively classify and validate scientific +observations. +2.1. V-FASTR: The VLBA Fast TRansients Experiment +V-FASTR (VLBA Fast TRansients) is a data analysis +system used by the VLBA to detect candidate fast transient +events. Principal investigators submit observing proposals to +the VLBA targeted at galaxies, supernovae, quasars, pulsars, +and more. V-FASTR analyzes all data collected by the VLBA +as part of routine processing and produces a nightly list of +candidates identified within the data processed that day. The +raw data for each candidate is temporarily saved in case it is +needed to interpret or follow up on a particularly promising or +unusual detection. However, the raw data consumes significant +disk space and therefore the candidate list must be reviewed on +a timely basis by experts. False positives can be deleted and +their disk space reclaimed, while truly interesting events can be +re-processed to enable the generation of a sky image to localize +the source of the signal. Software tools that streamline and +simplify this review process are therefore highly valued by +candidate reviewers and can have a positive impact on other +similar efforts throughout the world. +2.2. Data System Development at JPL +The Data Management Systems and Technologies group at +the JPL develops software ground data systems to support +NASA science missions. These pipelines are specifically +optimized to support the data-intensive and computationallyintensive +processing steps often needed to convert raw remotesensing +observations into higher level data products at scale so +that they can be interpreted by the scientists. The process +almost always involves developing a close collaboration with +project scientists to obtain an understanding of the processing +algorithms involved, a sense of the scale and throughput +requirements, and other operational constraints of the expected +production environment. +Over the years the group has developed a diverse portfolio of +data system experience across a broad spectrum of domains +including earth and climate science (Mattmann et al. 2009; +Hart et al. 2011; Tran et al. 2011), planetary science, +astrophysics, snow hydrology, radio astronomy, cancer +research (Crichton et al. 2001), and pediatric intensive care +(Crichton et al. 2011). +2.3. Open Source and OODT +One of the products of this long track record of experience in +the realm of scientific data processing systems is a suite of +software components known as OODT1 originally arose out of +a desire on the part of NASAʼs Office of Space Science to +improve the return on investment for individual mission data +systems by leveraging commonalities in their design to create a +reusable platform of configurable components, on top of which +mission-specific customizations could be made. OODT thus +represents both an architecture and a reference implementation. +Its components communicate with one another over standard, +open protocols such as XML-RPC2 and can be used either +individually, or coupled together to form more complex data +processing pipelines. +In 2009 OODT began the transition from a JPL-internal +development project to a free and open source software project +at the Apache Software Foundation (ASF).3 Graduating to a +top-level project in 2011, OODT has since undergone several +public releases at the ASF and is in use by a varied group of +scientific and commercial endeavors. As we will describe +further in Section 3, several OODT components form the core +platform of our candidate validation framework. The ready +availability of OODT components under a liberal license, +combined with their substantial pedigree was appealing to our +project both for time and budgetary considerations. +2.4. Related Work +In the following section we identify several ongoing efforts +that also utilize online tools to assist in the collaborative review +and classification of scientific observations. +2.4.1. Astropulse +Astropulse is part of a series of sky surveys for radio pulses +being conducted by the Search for Extraterrestrial Intelligence +(SETI) at the University of Berkeley (Siemion et al. 2010). +The Astropulse project conducts a survey of the sky from the +Arecibo Observatory in Puerto Rico, searching for short +(microsecond) broadband radio frequency pulses. While +Astropulseʼs use of Areciboʼs enormous single dish telescope +affords excellent sensitivity, V-FASTRʼs ability to perform +continent-scale baseline interferometery yields much greater +positional accuracy when attempting to localize the source of a +signal. +As a variant of the SETI@home project, Astropulse utilizes the +same distributed, collaborative volunteer computing infrastructure +accumulated over the years by that effort to perform a +number of computationally intense transformations and calculations +of the data in an attempt to better classify the origin of any +signals detected. The use of volunteer computing to perform units +of computational work is an appealing approach that obviates the +need to directly acquire sufficient hardware for the processing +demands. However, the fully automated nature of the approach is +not a natural fit for V-FASTRʼs manual review requirement. +2.4.2. Galaxy Zoo +GalaxyZoo4 is an Internet-based project that relies on the +help of volunteers to classify a very large database of galaxy +images recorded by either the Sloan Digital Sky Survey or the +Hubble telescope. Users are asked to classify galaxies based on +1 Apache OODT: http://oodt.apache.org/ +2 XML-RPC: http://xmlrpc.scripting.com/spec.html +3 http://apache.org/ +4 Galaxy Zoo: http://www.galaxyzoo.org/ +2 +The Astronomical Journal, 149:23 (7pp), 2015 January Hart et al. +shape, color and direction of rotation, and report on possible +unidentified features. The rationale behind human intervention +is that manual classification is more accurate and insightful +than any algorithm that can currently by undertaken by an +automatic program. To date, the project has met with success +that far exceeded expectations: more than 250,000 volunteers +have helped classify millions of images, resulting in the +confirmation of important scientific hypothesis, the formulation +of new ones, and the discovery of new interesting objects. +While Galaxy Zooʼs tactic of appealing to volunteers to +mitigate the challenge of image classification at scale is +attractive, the paradigm does not translate well to the V-FASTR +setting due to differences in the nature of the archives between +the two projects. Whereas Galaxy Zoo permits its volunteer +reviewers to leisurely peruse and mine a largely static image +archive, the rapidly growing data volumes associated with +ongoing V-FASTR observations dictate that reviews must be +regularly scheduled to keep the project within its resource +limits. +2.4.3. Foldit: The Protein Folding Game +Foldit (Cooper et al. 2010) is a collaborative online protein +folding game developed by the Center for Game Science +at the University of Washington, and it represents a +“crowd-sourced” attempt to solve the computationally challenging +task of predicting protein structure. Proteins, chains of +amino acids, play a key role in a wide range of human diseases, +but comparatively little is known about how they contort +themselves into the specific shapes that determine their +function. Because of the scale and complexity of the challenge, +the researchers behind Foldit have turned to the puzzle-solving +capabilities of human beings for assistance. After learning the +rules on simple challenges, players compete against one +another to design alternative protein structures, with the goal +of arriving at an arrangement that minimizes the total energy +needed to maintain the shape. +Foldit has created an environment in which the unknown and +diverse strategies of its human participants become a core +strength. Furthermore, by presenting the scientific activity as a +competitive game, the project, which currently boasts over +400,000 players, has shown that it is possible to recruit and +leverage human processing power at scale. This provides an +interesting model for other projects, including V-FASTR, +which at some point may rely upon a human element to +augment or improve automated processes. +3. IMPLEMENTATION +In this section we provide details on the implementation of +our metadata-driven framework for online review of V-FASTR +candidate detection events. We describe our methodology and +the considerations that informed our design, followed by a +presentation of the system architecture. +3.1. Development Methodology +Several factors influenced the development process and have +left their imprint on the final architecture. We feel that our +implementation is uniquely suited to the needs of the VFASTR +project precisely because these factors were identified +early on and were thus able to influence all aspects of the +design process. +3.1.1. Collaboration +As described in Section 2, our group has developed +substantial experience in the design and implementation of +data systems for a broad range of scientific domains. In each +case, a close working relationship with members of the project +science team was an essential ingredient to the success of the +project, and our experience developing an online candidate +review framework for V-FASTR was no different. As software +engineers familiar with the challenges inherent in scientific data +management, our intuitions about the technical challenges of +the system served us well in scoping out the project timeline. +However, it was our early and regular communication with +members of the V-FASTR science team that was critical to +obtaining the domain knowledge necessary to make accurate +assumptions, and in the early identification of issues. The +current system architecture, covering both the back and front +end elements, is a direct result of an ongoing feedback loop +between the science and software teams. +3.1.2. Constraints +As mentioned in Section 2, V-FASTR is a commensal +experiment that scans for fast transients in data that is already +being collected as part of the regular third-party use of the +VLBA instrument. As such, the experiment maintains a “guest” +status on the NRAO computing infrastructure. Consequently, +care must consistently be taken not to overtax NRAO system +resources, including disk storage, CPU time, and network +bandwidth. These physical constraints motivated many of the +architectural decisions described in the following sections. +Each V-FASTR data product may contain hundreds of files, +rooted at a top-level job directory, and includes two types of +products: filterbank data (up to ~100 GB per job) and +baseband voltage data (up to ~10 GB per job). The total data +storage capacity available to V-FASTR is just ~8 TB, enough +to contain ~800 jobs of ~10 GB each (on average). Because +products are produced at a average rate of ~10–20 per day (but +sometimes in the hundreds), the storage would be exhausted +within a few weeks unless products are periodically reviewed +by the science team analysts. During review, each candidate is +either flagged for higher-resolution processing (and saved) or +discarded as a false positive and the disk space reclaimed (see +Figure 1 for an overview of the average data volumes per job at +different processing stages). The desire to provide analysts with +a streamlined method for this review process is at the very core +of our design. +Similarly, the network bandwidth constraints of the host led +us to a data transfer configuration that focused on metadata +rather than requiring the complete transfer of raw, unreviewed, +and possibly spurious detection data over the Internet. Instead, +metadata sufficient to describe the salient characteristics of a +candidate event to a trained analyst was transferred into our +candidate review framework. This careful selection process had +the beneficial side effect of greatly limiting the size of the +transferred products, allowing for a considerably longer +retention period on the ~10 TB archive hosted at JPL. +Finally, security constraints were also critically important to +the design, particularly because the system spans two separate +security domains: NRAO and JPL. To comply with the security +requirements of the host system, data transfer was configured +on the NRAO system to allow read-only operations and was +made accessible only to clients originating from the JPL +3 +The Astronomical Journal, 149:23 (7pp), 2015 January Hart et al. +domain. Furthermore, on the front-end, the functionality +exposed by the web portal component interacted only with +the local metadata archive, eliminating the possibility of +corruption or inappropriate access to the raw observational +data. +3.2. Architecture +As previously mentioned, the candidate review framework is +driven by metadata describing the candidate events to be +reviewed by V-FASTR analysts. To communicate this data +from the raw source repository at the NRAO to an analyst using +a browser anywhere in the world, we developed a software +framework consisting of two principal components: a metadata +pipeline that manages the capture, transfer, and storage of +metadata annotations, and a web portal which provides analysts +with a convenient, context-rich environment for efficiently +classifying candidate events. +3.2.1. Metadata Pipeline +On the JPL side, the V-FASTR data products are processed +through a metadata extraction and data archiving pipeline that +eventually leads to the event candidates being available for +inspection on the web portal. The pipeline is composed of three +major software components: rsync, the OODT CAS Crawler, +and the OODT File Manager, depicted in Figure 2. +rsync. Data products are automatically transferred from the +NRAO staging area to the JPL server using rsync. rsync is a +popular application and data transfer protocol that allows to +synchronize the content of a directory tree between two +servers with minimal human intervention. It was chosen +because of its simplicity, high performance, reliability, and +wide range of configuration options. Through rsync, files are +transferred in compressed format and using delta encoding, +meaning that only the file differences are sent through +subsequent transfers. For this project, an rsync server +daemon was set up on the NRAO side to expose the data +staging area where the products are collected. For security +reasons, the daemon was restricted to allow read-only +operations to clients originating from a designated JPL IP +address. On the JPL side, an rsync client was set up to run +hourly as a system cron job, transferring products to the JPL +archive area. To minimize bandwidth usage, the client only +transfers a very small subset of the data comprising a product +directory tree, namely the detection images and the output +and calibration files containing the metadata needed by the +web portal. On average, this represents a reduction of the +data product size by a factor of 3.5 ´ 103: from an average +size of ~35 GB on the NRAO server (for a product with +several detections), to ~10 MB on the JPL server. The rsync +data transfer rates between the two servers were measured to +be around ~2 MBs-1, more than enough to transfer between +10 and 20 data products per day. +CAS Crawler. Once the data products are transferred to the +JPL server, they are automatically detected by the OODT +CAS Crawler daemon, which runs at sub-hour time intervals +to pick up new products as soon as they become available. +The Crawler is responsible for notifying the OODT File +Manager and therefore starting the product ingestion process. +For this deployment, the Crawler was configured to send a +signal only if two preconditions are both satisfied: (1) a +similarly named product does not already exist in the File +Manager catalog and (2) the product directory contains a +special marker file indicating that the product has been +processed by the mail program, and therefore is in a complete +state (i.e., no files are missing). +CAS File Manager. The OODT CAS File Manager is a +customizable software component that is responsible for +processing and archiving a data product, making it available +for query and access to clients. For this project, the File +Manager was deployed with the default Apache Lucene +metadata back-end, and configured to archive products +Figure 1. Depiction of the full V-FASTR data flow with volume estimates (per job) at each stage. The candidate review framework (both metadata pipeline and web +portal components) interact with the metadata and derived products repository at the intersection of A and B above. +4 +The Astronomical Journal, 149:23 (7pp), 2015 January Hart et al. +in-place, i.e., without moving them to a separate archive +directory, otherwise the rsync process would transfer them +again from the NRAO server. Additionally, we leveraged the +extensibility of the OODT framework by configuring the File +Manager with custom metadata extractors that were +purposely written to parse the information contained in the +V-FASTR output and calibration files. Information is +extracted at the three levels that comprise the hierarchy of +a V-FASTR data product: job, scan, and event. Additionally, +a numerical algorithm was written to assign each pair of +available images (-det.jpg and -dedisp.jpg) to the event that +generated them. +In general, a File Manager can store metadata in its back-end +catalog as different object types. Each object type is defined to +contain multiple metadata fields, where each field is composed +of a named key associated to one or more string values. For this +project, the decision was made to maintain a one-to-one +correspondence between a data product and the corresponding +metadata ingested into the catalog. So rather than defining three +object types for jobs, scans, and events, a single object type +was used holding all information for a data product in a single +container, with dynamically named keys that are encoded to +contain the scan and event numbers. This decision was +motivated by the desire to simplify and optimize the querying +of information by the web portal client, since all metadata for a +product is retrieved through a single request to the File +Manager. As a consequence, the default Apache Lucene +metadata catalog implementation had to be slightly modified +to allow for the ingestion of dynamically named metadata +fields. +3.2.2. Web Portal +The second major component of the candidate review +framework is an interactive web portal. The primary purpose +of the portal is to provide a convenient online environment for +the location-independent perusal and assessment of potential +candidates in context. The portal provides V-FASTR analysts +with the ability to quickly navigate through the available +information to identify candidates worthy of further inspection +on a familiar web platform. +The portal has been implemented as a PHP web application +using the Apache OODT Balance web framework running on +top of the Apache HTTPD Web Server. OODT Balance was +chosen here for its ability to easily integrate with the OODT +components in the back-end metadata pipeline, namely the +OODT CAS File Manager described earlier. Furthermore, the +flexible, modular approach of the framework allowed us to +quickly connect the web portal to the metadata repository and +rapidly begin constructing the necessary views specific to the +V-FASTR candidate review and validation use cases. +As Figure 3 shows, the web portal offers a variety of views +of the available metadata which are hierarchically organized to +match the conceptual relationships in the data. At the highest +level, a job or run might consist of multiple scans, each of +which may itself contain multiple detection event candidates. +This hierarchy, expressed in the metadata, is preserved in the +layout of the portal views, and the breadcrumb navigation +provided to facilitate orientation within the nested structure. +At the level of an individual event candidate (Figure 3, +middle image), two graphical representations of the event are +available to assist analysts in classifying the nature of the +signal. These images are generated automatically as part of the +initial candidate identification process (Wayth et al. 2011), and +they provide a trained analyst the necessary structural clues +needed to rapidly assess the received signal as being genuinely +extraterrestrial in origin or merely a product of RFI. +To support both metadata browsing in context and the desire +for an analyst to be able to rapidly peruse the image +representations of an entire job (many events in many scans) +at once, a compromise was struck whereby, for each job, a +portal user may select a traditional, hierarchical navigation or a +flattened view in which all of the (possibly numerous) event +candidates are presented simultaneously on screen and can be +accessed serially simply by scrolling the view. +Figure 2. Component diagram for the metadata pipeline component of the VFASTR +candidate review framework. +5 +The Astronomical Journal, 149:23 (7pp), 2015 January Hart et al. +Together, the metadata pipeline and the web portal constitute +an end-to-end framework for capturing, archiving, and +presenting metadata about detected transient event candidates +to V-FASTR scientists. Furthermore, by providing a reliable +process and flexible interface, the system directly streamlines +the analysis process, boosting the overall efficiency of the +project. +4. EVALUATION +As we have described in the previous section, the candidate +review framework embraces the model of online collaborative +validation of fast transient candidates by a team of geographically +dispersed analysts, and improves the efficiency with +which analysts may classify observational data. In this section +we describe the early results of our experience with the +operational deployment of the framework, as well as highlight +several areas for the evolution of the tool to further enhance its +utility. +4.1. Experience +The initial deployment of the collaborative review framework +for operational use by the V-FASTR science team was +made in early summer 2012. The immediate feedback was +largely positive: analysts praised the capabilities of the system, +the general improved accessibility afforded by a web-based +user interface, and the newfound capability to easily navigate +rapidly through all detections in a given job, or peruse the +different levels (scans and events) within a job individually. +The biggest initial complaint with the system was that too +many mouse clicks were required to complete an analysis of all +of the candidates in an entire job. +A consequence of the iterative feedback loop that developed +between the software and science teams (described further in +Section 3) was that suggestions for improvements were +repeatedly made, tracked, and acted upon. This process resulted +in an updated release occurring approximately every two weeks +during the first few months of the deployment. Suggestions for +improvements included the addition of various metadata fields +identified as critical to the classification task, updates to the +visual organization of the elements of the web portal views, and +a relentless focus on reducing the number of mouse clicks +required on the part of analyst users. +By the time of this writing, the V-FASTR portal has been +running operationally for several weeks, and we can draw some +early conclusions on usefulness of the system. Overall, as +reported by the science team, it seems like the project has +definitely accomplished its broad goal of facilitating the +collaborative task of inspecting and screening radio-transient +events. By extracting all relevant metadata from the latest data +products, and presenting it on the web portal in a concise +fashion, scientists can now execute their tasks more efficiently, +compared to earlier times when they had to log onto a terminal +and analyze the raw data manually. Additionally, the online +availability of all data and metadata through a browser interface +(as opposed to an ssh terminal) has allowed for greater +flexibility with regard to when and where evaluations can be +performed, including for the first time on a mobile device. +4.2. Evolution +On the whole, the ability to interact with the totality of the +candidate data and metadata through a browser interface has +greatly expanded the analysts’ ability to perform their tasks +with greater flexibility regarding when and where evaluations +can be performed. This includes, for the first time, anecdotal +accounts of an analyst reviewing candidates from a mobile +device. +With this freedom, in turn, has come a number of feature +requests which can be taken together to form a roadmap of +sorts for the evolution of the framework. Now that the +interaction with candidate metadata has transitioned to the +browser, the science team has identified three key features they +feel would complete the transition and entirely replace the prior +ad-hoc methods for coordinating the analysts’ activities: +Job assignment. As mentioned in Section 3, the timely +review of detection candidates is critical to remaining within +the resource constraints imposed upon the experiment. At the +moment, review jobs are assigned to analysts via email. +Augmenting the web portal with the ability to identify an +individual analyst would enable the presentation of +a prioritized list of that analystʼs outstanding review tasks. +Effort Tracking. Along the same lines, it is important to +spread the analysis load evenly across the science team, since +no one person is performing the analysis as his or her fulltime +job. Augmenting the framework with the ability to track +the analysis contributions of individual users over time +would assist in the equitable scheduling of future +review jobs. +Figure 3. Screen shots of the initial version of the web portal component. From left to right: the portal home page displaying recent jobs and associated event counts, +image metadata associated with an individual event candidate, full metadata listing, including associated scans, for an observation job. +6 +The Astronomical Journal, 149:23 (7pp), 2015 January Hart et al. +In-browser archiving. When an analyst determines a +candidate event merits high-resolution followup, the last +step is to archive the associated raw data so that it can be +evaluated at a later date. Currently, due to the security +restrictions permitting read-only access to external connections +to the archive at the NRAO (described in Section 3), +this process is handled out-of-band by the analyst logging +into an NRAO machine and archiving the appropriate data +manually. It is possible that, with the identity management +features discussed in the previous two items (and the +associated auditing capabilities that it could entail) the +restrictions might be negotiated to the point that certain +defined activities (such as archiving a single job directory) +could be initiated from within the portal environment. +5. CONCLUSION +V-FASTR, and commensal operations more generally, are +particularly challenging experiments due to extreme data +volume and real-time requirements. Processing occurs continually, +and the data flow must be coordinated across multiple +physical locations with transport mechanisms ranging from +FedEx transport (disks from the antenna), high-bandwidth +interconnects (the correlator and transient detection systems), +daily rsync over IP (the ska-dc mirror), and distributed WWW +protocols (manual review which takes place by analysts on +three continents). Various components of the system operate on +millisecond, hourly, and daily clocks and all components must +continue operating since there is very little margin for buffer +resources. In addition, the data processing components are +highly heterogeneous, with human experts playing their own +role as scheduled pattern recognition engines in the overall +architecture. By facilitating timely review, and reducing the +learning curve for new reviewers, the V-FASTR portal will +play a critical role in keeping the data flowing and making the +system sustainable in the long term. +This effort was supported by the Jet Propulsion Laboratory, +managed by the California Institute of Technology under a +contract with the National Aeronautics and Space +Administration. +REFERENCES +Cooper, S., Khatlib, F., & Treuille, A. 2010, Natur, 466, 756–60 +Cordes, J., Lazio, T., & McLaughlin, M. 2004, NewAR, 48, 1459–72 +Crichton, D., Kincaid, H., Downing, G., Srivastava, S., & Hughes, J. S. 2001, +in Proc. of the 14th IEEE Symp. on Computer-Based Medical Systems, An +Interoperable Data Architecture for Data Exchange in a Biomedical +Research Network (Piscataway, NJ: IEEE), 65–72 +Crichton, D., Mattmann, C., Hart, A., et al. 2011, in Proc. of the 24th +IEEE Symp. on Computer-Based Medical Systems An Informatics +Architecture for the Virtual Pediatric Intensive Care Unit (Piscataway, +NJ: IEEE), 1–6 +Hart, A., Goodale, C., Mattmann, C., et al. 2011, in Proc. of the 2nd Int. +Workshop on Software Engineering for Cloud Computing, A Cloudenabled +Regional Climate Model Evaluation System (New York: +ACM), 43–49 +Mattmann, C., Crichton, D., Medvidivic, N., & Hughes, J. S. 2006, in Proc. +2006 Int. Conf. on Software Engineering, A Software Architecture-based +Framework for Highly Distributed and Data Intensive Scientific +Applications (New York: ACM), 721–30 +Mattmann, C., Freeborn, D., Crichton, D., et al. 2009, in Proc. IEEE Int. Conf. +on Space Mission Challenges for Information Technology, A Reusable +Process Control System Framework for the Orbiting Carbon Observatory +and NPP Sounder PEATE Missions (Piscataway, NJ: IEEE), 165–72 +Romney, J. D. 2010, NRAO, http://www.vlba.nrao.edu/astro/obstatus/current/ +obssum.html. +Siemion, A., von Korff, J., McMahon, P., Korpela, E., & Werthimer, D. 2010, +AcAau, 67, 1342–9 +Thompson, D., Wagstaff, K., Brisken, W., et al. 2011, ApJ, 735, 98 +Tran, J., Cinquini, L., Mattmann, C., et al. 2011, in Evaluating Cloud +Computing in the NASA DESDynI Ground Data System Proc. of the II +International Workshop on Software Engineering for Cloud Computing +(New York: ACM), 36–42 +Wayth, R., Brisken, W., Deller, A., et al. 2011, ApJ, 735, 97 +Wayth, R., Tingay, S., & Deller, A. 2012, ApJL, 753, L36 +7 +The Astronomical Journal, 149:23 (7pp), 2015 January Hart et al. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A FRAMEWORK FOR COLLABORATIVE REVIEW OF CANDIDATE EVENTS IN HIGH DATA RATE STREAMS THE V-FASTR EXPERIMENT AS A CASE STUDY.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..00500ea9ef89f7c35d8d152086a7cd8b74a0c1a7 GIT binary patch literal 140288 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%0D3m@r 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

?5J+_q|@Zij>Eq2g>8o%RZafl~dem#yz1|u4b#B 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 k13wFHU;|Q@M#f}m?TI?9HW5tdW zJ6`Mru@l8k5-TTmve+qNr;42>cDmRZVrPn-C5At}a*o)!VtC)j`C=D{T_|>u*u`R( zh+Qg%KiE`W>~gUy#I6*R_k-lF7Q065S~1+;xL)iAu^Yv161!RK7O`8!ZWFs*3~!^U zAcprw+$DCm*gaynA9A1A{bCP@Jt+2&*u!Fvh&?LynAqcDPl!D!R#EIJv8Tmw|Ku65 zXT_cqdtU4XG5iUSm&9HcdqwP3vDd^Zi@h#ZMeGeR+;6ES_NLfdV%5do7JEnRU9lQs zHO1Z&t0h)jtd7|GVjqZoC{|ajo>+ac24WwHeJs{ctdUq_u_j_o#hQsV7i%HbQmmEO zCt|I|J{4;t)>f>YSbMP!VjaagiFFq1BGy%`n^m$}zte;qau>oQO z#RiED78@cqRBV{oaIq0$BgICEjTRdtHdbt$*m$uCViUzCiA@%pA~scQn%H!)8DcZV zW{J%fnTP3zyY>n7jv2|kW#Wsj- z6x$@WS!|2gR?^Ua#l8{yR&1NtcVgScz8CvJ>_@Sm#C{h0MeJ9x-^6|w z`$OzcvA@LrkvBg5BR_YD;Wn9kD{oHTrJwfURse~BX@o(2<^}peiDNstuuJe*)f3%?@pMn3g_MHDe=zl3RSnK~^ DU4=-a literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions-relation.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions-relation.txt new file mode 100644 index 0000000..9871327 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions-relation.txt @@ -0,0 +1,591 @@ +page&Paul Ramirez&依赖 +author&publication&AGGREGATION +page&22 may 2014&依赖 +enhancement&downloaded file&AGGREGATION +user&downloaded file&依赖 +user&enhancement&依赖 +Charles E. Miller Jet Propulsion Laboratory California Institute&Technology Pasadena&AGGREGATION +We&science processing pipeline&实现 +We&reusable architecture and implementation framework&依赖 +We&mission ground data system&实现 +system&software component&依赖 +Our&system& +system&software component&依赖 +archive ( cas )&QuikSCAT , SeaWinds and AMT earth science mission&依赖 +software component&component&GENERALIZATION +paper&orbiting carbon observatory (&依赖 +paper&pc&依赖 +paper&two current earth science mission&依赖 +context&two current earth science mission&AGGREGATION +paper&context&依赖 +order&magnitude&AGGREGATION +1 Introduction Data volume&order&依赖 +1 Introduction Data volume&magnitude&依赖 +1 Introduction Data volume&magnitude&依赖 +1 Introduction Data volume&magnitude&依赖 +1 Introduction Data volume&order&依赖 +1 Introduction Data volume&order&依赖 +increase power and pervasiveness&high performance computing&AGGREGATION +low cost&era&依赖 +low cost&disk storage space&AGGREGATION +low cost&era&依赖 +previously unimaginable science question&era&依赖 +previously unimaginable science question&year&依赖 +science question&sea surface temperature&依赖 +Earth&cycle& +better understanding&’s global carbon cycle and climate change&AGGREGATION +study&sea surface temperature&AGGREGATION +science question&study&依赖 +significant portion&space-based NASA earth science mission&AGGREGATION +goal&1A strategically&AGGREGATION +several focused series&step&AGGREGATION +processing&mundane activity&依赖 +processing&datum&依赖 +prospective and retrospective physical modeling&scene&AGGREGATION +processing&marshalling&依赖 +processing&datum&依赖 +processing&mundane activity&依赖 +processing&marshalling&依赖 +( removal&special space “ header ” information )&AGGREGATION +our&work& +central data base ( cdb ) subsystem&datum base management software&依赖 +datum base management software¤t and future planetary mission&依赖 +central data base ( cdb ) subsystem&mgd&AGGREGATION +central data base ( cdb ) subsystem&datum base management software&依赖 +datum base management software¤t and future planetary mission&依赖 +central data base ( cdb ) subsystem&datum base management software&依赖 +central data base ( cdb ) subsystem&datum base management software&依赖 +architectural principle&extensibility&AGGREGATION +architectural principle&ammo&依赖 +part&larger system&AGGREGATION +architectural principle&CDB&AGGREGATION +CDB&controlled , centralized system&依赖 +part&controlled , centralized system&AGGREGATION +work&clear two significant trend&依赖 +Our&work& +work&clear two significant trend&依赖 +developer&method&依赖 +developer&method&依赖 +we&“ rapid adaptation ”&依赖 +we&original CDB software&依赖 +“ rapid adaptation ”&original CDB software&AGGREGATION +technology task&task&GENERALIZATION +technology task&time&依赖 +NASA Office&Space Science&AGGREGATION +“ out&box ” core data management software service&AGGREGATION +Several author&this paper support seawind&AGGREGATION +result&collaboration&AGGREGATION +CAS component&component&GENERALIZATION +their&systems& +QuikSCAT&planned 2-year mission&依赖 +its&year& +10th year&planned 2-year mission&AGGREGATION +reprocessing and simultaneous&7 year&AGGREGATION +7 year&datum&AGGREGATION +JPL earth mission&increased data volume&依赖 +CAS component&Sea&依赖 +JPL earth mission&increased data volume&依赖 +JPL earth mission&far more complex processing (&依赖 +CAS component&Winds and AMT&依赖 +JPL earth mission&far more complex processing (&依赖 +development&a third component&AGGREGATION +refactoring&CAS component&AGGREGATION +refactoring&several issue&依赖 +refactoring&several issue&依赖 +refactoring&several issue&依赖 +refactoring&several issue&依赖 +refactoring&CAS&AGGREGATION +it&ingestion&依赖 +ingestion&file&AGGREGATION +initiation&workflow&AGGREGATION +it&initiation&依赖 +it&file&依赖 +it&workflow&依赖 +specific time&day&AGGREGATION +ingestion&particular file or file type&AGGREGATION +independent evolution&component&AGGREGATION +refactoring&component&依赖 +refactoring&independent evolution&依赖 +combination&three refactored CAS component&AGGREGATION +we&File Manager , Workflow Manager and Resource Manager component&依赖 +we&component&依赖 +we&reusable interface&依赖 +we&reusable interface&依赖 +we&configurable push-pull framework and crawler framework&依赖 +phase&algorithm development&AGGREGATION +easy integration&science code&AGGREGATION +they&future&依赖 +they&Earth science mission work&依赖 +we&core PCS component&依赖 +their&architecture& +future&Earth science mission work&AGGREGATION +we&architecture&依赖 +we&architecture&依赖 +they&us&依赖 +they&OCO&依赖 +our&components& +they&problem&依赖 +we&core PCS component&依赖 +its&evolution& +We&same spirt&依赖 +We&architectural reuse , understanding and mission specific adaptation&依赖 +genesis&modern pc&AGGREGATION +same spirt&architectural reuse , understanding and mission specific adaptation&AGGREGATION +our&uniquely& +state&art&AGGREGATION +We&us&依赖 +rest&paper&AGGREGATION +rest&follow&依赖 +area&grid computing , workflow systems and science data system&AGGREGATION +Section 3&greater detail&依赖 +Section 3&core PCS architectural component&依赖 +Section 4&our experience&依赖 +Section 4&leveraging&依赖 +our&experience& +section 5 round&paper&依赖 +section 5 round&paper&依赖 +development&virtualization and sharing&依赖 +development&organizational and geographic boundary&依赖 +virtualization and sharing&processing and storage resource&AGGREGATION +development&8 ]&依赖 +development&8 ]&依赖 +many groups and organization&power&依赖 +development&virtualization and sharing&依赖 +development&virtualization and sharing&依赖 +development&8 ]&依赖 +development&organizational and geographic boundary&依赖 +many groups and organization&grid&依赖 +development&8 ]&依赖 +development&8 ]&依赖 +development&8 ]&依赖 +development&processing and storage resource&依赖 +development&processing and storage resource&依赖 +development&processing and storage resource&依赖 +development&8 ]&依赖 +development&virtualization and sharing&依赖 +development&organizational and geographic boundary&依赖 +power&grid&AGGREGATION +development&8 ]&依赖 +many groups and organization&power&依赖 +development&processing and storage resource&依赖 +enabler&large-scale scientific research&AGGREGATION +many groups and organization&power&依赖 +development&processing and storage resource&依赖 +development&organizational and geographic boundary&依赖 +development&processing and storage resource&依赖 +development&processing and storage resource&依赖 +development&virtualization and sharing&依赖 +development&8 ]&依赖 +development&8 ]&依赖 +development&8 ]&依赖 +development&8 ]&依赖 +development&organizational and geographic boundary&依赖 +development&organizational and geographic boundary&依赖 +development&virtualization and sharing&依赖 +development&8 ]&依赖 +many groups and organization&grid&依赖 +development&organizational and geographic boundary&依赖 +development&8 ]&依赖 +development&computational grid [&AGGREGATION +development&virtualization and sharing&依赖 +many groups and organization&grid&依赖 +we&ongoing software project&依赖 +we&paper&依赖 +collection&open-source software tool&AGGREGATION +2.1 Grid Systems The Globus toolkit [ 9 ]&open-source software tool&依赖 +2.1 Grid Systems The Globus toolkit [ 9 ]&open-source software tool&依赖 +many aspect&a distribute , service-oriented infrastructure include security , resource and datum discovery&AGGREGATION +communication module&particular gridbased effort&依赖 +suite&software components and library&AGGREGATION +2.2 Workflow Systems&number&依赖 +2.2 Workflow Systems&number&依赖 +2.2 Workflow Systems&explosion&依赖 +2.2 Workflow Systems&workflow languages and software system&依赖 +2.2 Workflow Systems&workflow languages and software system&依赖 +2.2 Workflow Systems&explosion&依赖 +number&workflow languages and software system&AGGREGATION +Yu and Buyya [ 15 ]&scientific workflow system&依赖 +they&technology&依赖 +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&workflow system&依赖 +characterization&workflow system&AGGREGATION +Woollard and et . al.&workflow system&依赖 +Woollard and et . al.&characterization&依赖 +Woollard and et . al.&characterization&依赖 +author&Production Systems&依赖 +OCO and NPP Sounder PEATE ground data system&which&依赖 +author&certain workflow system&依赖 +example&which&AGGREGATION +effective usage&available distributed computing and storage resource&AGGREGATION +University&Wisconsin Madison&AGGREGATION +Condor&user&依赖 +their&execution& +Condor&user&依赖 +Condor&infrastructure&依赖 +notification&completion&AGGREGATION +Condor&detail&依赖 +Condor&transparently&依赖 +detail&infrastructure&AGGREGATION +particulars&detail&AGGREGATION +variant&Condor and Condor-G [ 10 ]&AGGREGATION +variant&Globus toolkit&依赖 +variant&Globus toolkit&依赖 +variant&Globus toolkit&依赖 +layer&abstraction&AGGREGATION +large number&grid-based compute node&AGGREGATION +Pegasus&workflow&依赖 +Pegasus&workflow&依赖 +event&failure&AGGREGATION +small number&compute node&AGGREGATION +Pegasus&ability&依赖 +Pegasus&ability&依赖 +Pegasus&ability&依赖 +Pegasus&workflow&依赖 +reliability&system&AGGREGATION +vast quantity&intermediate and final data product&AGGREGATION +base level&service&AGGREGATION +large number&system&AGGREGATION +our&discussion& +support&operation&AGGREGATION +operation&Goddard Earth Science Data&AGGREGATION +developer&pain&依赖 +cost&development&依赖 +cost&S4PA&依赖 +development&S4PA&AGGREGATION +primary copy&all datum online&AGGREGATION +its&name& +favor&first-class architectural component and connector&AGGREGATION +large number&complimentary , interconnected service&AGGREGATION +complete science data processing pipeline&complimentary , interconnected service&依赖 +complete science data processing pipeline&large number&依赖 +We&Open Grid Framework&依赖 +2.4.1 OGF The Open Grid Forum [ 2 ]&standards and specification&依赖 +2.4.1 OGF The Open Grid Forum [ 2 ]&grid-based software system&依赖 +2.4.1 OGF The Open Grid Forum [ 2 ]&standards and specification&依赖 +2.4.1 OGF The Open Grid Forum [ 2 ]&adoption&依赖 +adoption&grid-based software system&AGGREGATION +OGF&business , government , scientific , and academic organization&依赖 +utilization&grid&AGGREGATION +OGF&role&依赖 +OGF&grid&依赖 +role&grid&AGGREGATION +OGF&independent voice&依赖 +OGF&grid&依赖 +their&potential& +OGF&independent voice&依赖 +OGF&role&依赖 +2.4.2 OAI The Open Archives Initiative [ 1 ]&interoperability&依赖 +2.4.2 OAI The Open Archives Initiative [ 1 ]&standard&依赖 +goal&application interoperability&依赖 +goal&application interoperability&依赖 +application interoperability&interoperability&GENERALIZATION +goal&OMI-PMH&AGGREGATION +OAI&broader accessibility and usability&依赖 +broader accessibility and usability&distributed data resource&AGGREGATION +rich array&application-specific metada&AGGREGATION +OAI&distributed data resource&依赖 +we§ion&依赖 +we&PCS core component&依赖 +we&3 PCS Core Architecture&依赖 +2 ) managing pipeline processing&PCS Task Wrapper&依赖 +2 ) managing pipeline processing&PCS Task Wrapper&依赖 +three PCS framework&two critical higher level service&实现 +one&two critical higher level service&AGGREGATION +three PCS framework&one&实现 +three PCS framework&two critical higher level service ###&实现 +We&component&依赖 +We&below&依赖 +We&greater detail&依赖 +overall PCS architecture&Fig. 1&依赖 +critical object&Products&依赖 +critical object&collection&依赖 +collection&one or more file&AGGREGATION +critical object&one or more file&依赖 +critical object&one or more file&依赖 +critical object&Products&依赖 +critical object&collection&依赖 +their&Metadata& +A map&key&AGGREGATION +multiple value&descriptive information&AGGREGATION +its&location& +file&location& +File Manager&use&依赖 +File Manager&what type&依赖 +what type&file uniform resource identifier ( uri ) [ 5 ] generation scheme&AGGREGATION +File Manager&file uniform resource identifier ( uri ) [ 5 ] generation scheme&依赖 +description&Product&AGGREGATION +File Manager&use&依赖 +File Manager&file uniform resource identifier ( uri ) [ 5 ] generation scheme&依赖 +element&form&依赖 +element&associated definition&依赖 +form&associated definition&AGGREGATION +element&additional metada&依赖 +A URI generation scheme&location&依赖 +A URI generation scheme&built&依赖 +A URI generation scheme&archive (&依赖 +Product&one or more reference&依赖 +member&single Product Type&AGGREGATION +Product&single Product Type&依赖 +Metadata&mapping&依赖 +mapping&Product Type&AGGREGATION +Metadata&one or more element&依赖 +Product Type&associated Versioner&依赖 +description , execution , and monitoring&Workflows&AGGREGATION +3.2 Workflow Manager TheWorkflow Manager component&Workflows&依赖 +3.2 Workflow Manager TheWorkflow Manager component&description , execution , and monitoring&依赖 +sequence&task&AGGREGATION +Workflows&output datum&依赖 +business&practices& +event&what triggerworkflow&依赖 +dynamic set&property&AGGREGATION +description&control flow&AGGREGATION +data flow&sequence&AGGREGATION +instance&Workflow&AGGREGATION +WorkflowInstance&shared Metadata context&依赖 +who&theWorkflow&依赖 +description&data flow&AGGREGATION +part&Workflow&AGGREGATION +static configuration property&WorkflowTask&依赖 +execution&WorkflowTask&AGGREGATION +Event&one or more Workflow Instances&依赖 +Workflow Instance&Workflow&依赖 +run-time execution model&Workflow&AGGREGATION +Workflow&one or more Workflow Tasks&依赖 +Workflow Task&single Workflow Task Configuration&依赖 +Workflow Task&model&依赖 +Workflow Task&a corresponding workflow task instance (&依赖 +Workflow Condition&corresponding Workflow Condition Instance&依赖 +3.3 Resource Manager The Resource Manager component&hardware resource&依赖 +set&hardware resource&AGGREGATION +3.3 Resource Manager The Resource Manager component&jobs , storage and networking resource&依赖 +3.3 Resource Manager The Resource Manager component&excecution , monitoring and traacking&依赖 +3.3 Resource Manager The Resource Manager component&set&依赖 +excecution , monitoring and traacking&jobs , storage and networking resource&AGGREGATION +abstract representation&execution unit&AGGREGATION +Job&that&依赖 +abstrct representation&input&AGGREGATION +its&Input& +complete specification&Job&AGGREGATION +physical code&job execution&依赖 +Job Spec&exactly one job&依赖 +Job&single Job Instance&依赖 +Job&one Resource Node&依赖 +satisfaction&ingestion pre-condition&AGGREGATION +type&files and directory&依赖 +type&files and directory&依赖 +type&activity&AGGREGATION +type&identification&依赖 +type&identification&依赖 +identification&files and directory&AGGREGATION +crawled datum&standard three state lifecycle&依赖 +crawled datum&standard three state lifecycle&依赖 +Crawler&customized precondition verification&依赖 +we&Product Crawlers&依赖 +Crawler&line&依赖 +three type&Product Crawlers&AGGREGATION +Crawler&crawilng strategy&依赖 +we&three type&依赖 +line&customized precondition verification&AGGREGATION +we&Product Crawlers&依赖 +we&three type&依赖 +file&process&依赖 +behavior&MetExtractorProductCrawler&AGGREGATION +AutoDetectCrawler&content type identification&依赖 +critical object&three phase&依赖 +ProductCrawler&given phase&依赖 +one or more&three phase&AGGREGATION +critical object&one or more&依赖 +Precondition Comparator -&MetExtractorProductCrawler and AutoDetectProductCrawler&依赖 +part&ProductCrawlers customized implementation&AGGREGATION +They&ProductCrawlers customized implementation&依赖 +They&precondition verification&依赖 +ProductCrawlers customized implementation&appropriate time&依赖 +ProductCrawlers customized implementation&precondition verification&AGGREGATION +protocol plugin&HTTP&实现 +implementation&remote protocol&AGGREGATION +one service&protocol layer&依赖 +one service&ProductCrawler&依赖 +3.5 push pull framework crawler framework&3.5 push pull framework crawler framework&依赖 +one service&further work&依赖 +protocol plugin&implementation&依赖 +development&protocol layer&AGGREGATION +protocol plugin&remote protocol&实现 +Push Pull Framework&modern web protocol&依赖 +Push Pull Framework&remote datum acquisition and acceptance&依赖 +Push Pull Framework&modern web protocol such ###&依赖 +email-based push datum acceptance&IMAP&依赖 +file&which&依赖 +Retrieval Method&manner&依赖 +file&manner&依赖 +file&remote site&依赖 +complexity&multi-threaded file download )&AGGREGATION +a fileretrievalsystem (&multi-threaded file download )&依赖 +configuration file&file&GENERALIZATION +a fileretrievalsystem (&complexity&依赖 +ListRetriever&given list&依赖 +ListRetriever&file URIs [ 5 ]&依赖 +given list&file URIs [ 5 ]&AGGREGATION +Virtual&filter uri&依赖 +Protocol -&transfer protocol&依赖 +Protocol -&file transfer and communication&依赖 +execution&NASA Product Generation executive&AGGREGATION +pge&step&依赖 +pge&overall scientific process&依赖 +pge&scientific algorithm&依赖 +its&lifecycle& +PGE&file , or metada&依赖 +manner&requirement&依赖 +its&requirements& +PGE&file&依赖 +sequence&execution&AGGREGATION +PGE&upstream or downstream pge&依赖 +PGE&knowledge&依赖 +knowledge&upstream or downstream pge&AGGREGATION +PGE&knowledge&依赖 +PGE&upstream or downstream pge&依赖 +PGE&upstream or downstream pge&依赖 +PGE&knowledge&依赖 +its&file& +output Product file and Metadata generation&PCS Task Wrapper framework&依赖 +PCS Task Wrapper&output Product file&依赖 +PCS Task Wrapper&Crawler Framework&依赖 +execution&step&AGGREGATION +generalized set&action&AGGREGATION +abstract class&generalized set&依赖 +abstract class&action&依赖 +Pge Config File Builder&PgeConfig object&依赖 +additional Metadata&information&依赖 +lifecycle&xml file&实现 +PCS Task Wrapper&simple but powerful XML syntax&依赖 +xml file&file&GENERALIZATION +lifecycle&scientist&实现 +Config File Property Adder&Pge Config file object&依赖 +Science Pge Config File Writer&PGE run information&依赖 +Science Pge Config File Writer&configuration file&依赖 +Component Interaction&( xsl ) transformation&依赖 +Component Interaction&SciPgeConfigFileWriter&依赖 +We&NASA mission&依赖 +We&control system ( pc&依赖 +system&high throughput job processing&依赖 +mission&File Manager&依赖 +mission&4.1 Orbiting Carbon Observatory Mission&依赖 +OCO&four terabyte&依赖 +four terabyte&) datum ( ft&AGGREGATION +100 %&datum&AGGREGATION +OCO&PCS software&依赖 +OCO&) datum&依赖 +variant&scientific software&AGGREGATION +variant&science computing facility&依赖 +variant&science computing facility&依赖 +pc&science computing facility&依赖 +gigabyte&iasi datum (&AGGREGATION +hundred&gigabyte&AGGREGATION +4.2 NPP Sounder PEATE Mission Specifically NPP Sounder PEATE&File Manager and Workflow Manager&依赖 +PCS framework&addition&依赖 +PCS framework&4.3 Further application&依赖 +PCS framework&two aforementioned NASA mission&依赖 +PCS framework&’s early detection research network ( edrn ) [ 6 ]&依赖 +work&Network& +JPL&EDRN&依赖 +PCS framework&collection , annotation and dissemination&依赖 +PCS framework&raw scientific datum&依赖 +PCS framework&early detection&依赖 +collection , annotation and dissemination&raw scientific datum&AGGREGATION +early detection&cancer&AGGREGATION +JPL&informatics effort&依赖 +PCS framework&cancer&依赖 +NASA mission&mission&GENERALIZATION +software integration risk&mission development [ 13 ]&依赖 +design phase&mission&AGGREGATION +norm&scratch&依赖 +their&system& +norm&scratch&依赖 +common science data system service&benefit&依赖 +we&standards-based software framework&依赖 +we&end&依赖 +common science data system service&reuse&依赖 +adaptable&requirement&依赖 +benefit&reuse&AGGREGATION +reusable software&most basic science data system&依赖 +most basic science data system&metada management&依赖 +Additional framework&core capability&依赖 +we&paper&依赖 +mission&nasas decadal survey present additional challenge&依赖 +mission&nasas decadal survey present additional challenge&依赖 +mission&orbiting carbon observatory ( oco ) and npp sounder peate mission&依赖 +mission&nasas decadal survey present additional challenge&依赖 +pc&orbiting carbon observatory ( oco ) and npp sounder peate mission&依赖 +mission&orbiting carbon observatory ( oco ) and npp sounder peate mission&依赖 +mission&orbiting carbon observatory ( oco ) and npp sounder peate mission&依赖 +jpl-led soil moisture active passive ( smap ) mission (&operation&依赖 +jpl-led soil moisture active passive ( smap ) mission (&pc&依赖 +jpl-led soil moisture active passive ( smap ) mission (&operation&依赖 +jpl-led soil moisture active passive ( smap ) mission (&pc&依赖 +most earth science datum system&algorithm team&依赖 +most earth science datum system&algorithm team&依赖 +most earth science datum system&operational infrastructure&依赖 +most costly and risky aspect&most earth science datum system&AGGREGATION +most earth science datum system&operational infrastructure&依赖 +cost and risk&development-to-operation&AGGREGATION +our&focus& +easy integration&algorithm&AGGREGATION +JPL-led mission&SMAP&依赖 +Dynamics&ice ( desdynus ) mission&AGGREGATION +challenge&desdynus&AGGREGATION +challenge&deployment&依赖 +challenge&deployment&依赖 +challenge&us&依赖 +deployment&PCS component&AGGREGATION +challenge&PCS component&依赖 +challenge&us&依赖 +challenge&PCS component&依赖 +Acknowledgements This effort&Jet Propulsion Laboratory&依赖 +California Institute&Technology&AGGREGATION +reference&1 ] open archive initiative , http://www.openarchives.org&依赖 +technical report rfc 2396 , 1998&technical report rfc 2396 , 1998&依赖 +a distribute information service architecture&early detection&依赖 +a distribute information service architecture&cancer&依赖 +a distribute information service architecture&a distribute information service architecture&依赖 +a distribute information service architecture&cancer&依赖 +a distribute information service architecture&biomarker discovery&依赖 +a distribute information service architecture&early detection&依赖 +a distribute information service architecture&cancer&依赖 +a distribute information service architecture&a distribute information service architecture&依赖 +a distribute information service architecture&a distribute information service architecture&依赖 +a distribute information service architecture&cancer&依赖 +a distribute information service architecture&a distribute information service architecture&依赖 +a distribute information service architecture&biomarker discovery&依赖 +a distribute information service architecture&early detection&依赖 +a distribute information service architecture&early detection&依赖 +a distribute information service architecture&biomarker discovery&依赖 +a distribute information service architecture&biomarker discovery&依赖 +anatomy&grid&AGGREGATION +Condor-a hunter&idle workstation&AGGREGATION +a software architecture-based framework&a software architecture-based framework&依赖 +a software architecture-based framework&a software architecture-based framework&依赖 +a software architecture-based framework&highly distribute and datum intensive scientific application&依赖 +a software architecture-based framework&a software architecture-based framework&依赖 +a software architecture-based framework&highly distribute and datum intensive scientific application&依赖 +a software architecture-based framework&highly distribute and datum intensive scientific application&依赖 +a software architecture-based framework&highly distribute and datum intensive scientific application&依赖 +a software architecture-based framework&a software architecture-based framework&依赖 +page&ICSE&依赖 +a science datum system approach&smap mission&依赖 +smap mission&mission&GENERALIZATION +a science datum system approach&smap mission&依赖 +taxonomy&apr 2005&依赖 +taxonomy&apr 2005&依赖 +taxonomy&workflow management system&AGGREGATION +taxonomy&apr 2005&依赖 +taxonomy&apr 2005&依赖 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt new file mode 100644 index 0000000..de3ecb3 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt @@ -0,0 +1,716 @@ +See discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/232619682 +A Reusable Process Control System Framework for the Orbiting Carbon +Observatory and NPP Sounder PEATE missions +Article · July 2009 +DOI: 10.1109/SMC-IT.2009.27 +CITATIONS +21 +READS +90 +11 authors, including: +Some of the authors of this publication are also working on these related projects: +Airborne Snow Observatory View project +The Planetary Data System PDS4 Information Model-Driven Architecture View project +Daniel J. Crichton +NASA +138 PUBLICATIONS 791 CITATIONS +SEE PROFILE +Sean Hardman +NASA +20 PUBLICATIONS 53 CITATIONS +SEE PROFILE +Paul Ramirez +NASA +39 PUBLICATIONS 408 CITATIONS +SEE PROFILE +Sean Colin-Patrick Kelly +NASA +43 PUBLICATIONS 213 CITATIONS +SEE PROFILE +All content following this page was uploaded by Paul Ramirez on 22 May 2014. +The user has requested enhancement of the downloaded file. +A Reusable Process Control System Framework for the Orbiting Carbon +Observatory and NPP Sounder PEATE missions +Chris A. Mattmann, Dana Freeborn, Dan Crichton, Brian Foster, +Andrew Hart, David Woollard, Sean Hardman, Paul Ramirez, +Sean Kelly, Albert Y. Chang, Charles E. Miller +Jet Propulsion Laboratory +California Institute of Technology +Pasadena, CA 91109, USA +mattmann@jpl.nasa.gov +Abstract +We describe a reusable architecture and implementation +framework for managing science processing pipelines for +mission ground data systems. Our system, dubbed “PCS”, +for Process Control System, improves upon an existing software +component, the OODT Catalog and Archive (CAS), +which has already supported the QuikSCAT, SeaWinds and +AMT earth science missions. This paper focuses on PCS +within the context of two current earth science missions: the +Orbiting Carbon Observatory (OCO), and NPP Sounder +PEATE projects. +1 Introduction +Data volume and computational needs for Earth science +missions at NASA are growing by orders of magnitude. The +low cost of disk storage space and the increasing power +and pervasiveness of high performance computing have engendered +an era in which previously unimaginable science +questions can be answered in years rather than decades. +These science questions range from the study of sea surface +temperatures to observe maritime pollution, to measuring +atmospheric chemical composition for weather forecasting, +to obtaining a better understanding of the Earth’s global carbon +cycle and climate change as a whole. +A significant portion of any space-based NASA earth +science mission is a Ground Data System (GDS). The GDS +is responsible for receiving raw spacecraft data as delivered +from a ground station1, and processing the information +through several focused series of steps with the goal of +1A strategically placed data center on Earth with ample ground-tospace +bandwidth and connectivity for receiving satellite data. +delivering the scientific value encoded in the data to interested +scientists, both locally at an instrument team center, +and then to universities, decision makers, and the broader +science community. The processing that a GDS must perform +ranges from mundane activities including data (un- +)marshalling (removal of special space “header” information), +and subsetting, to more involved processes including +temporal and spatial positioning, calibration, and statistical +analysis, to complex scientific assimilation including +prospective and retrospective physical modeling of a scene. +Beginning with Automated Multi-Mission Operations +System (AMMOS) Multi-mission Ground Data System +(MGDS) in the early 1990s, our work has focused on building +reusable software components for GDS systems. As +an example, the Central Data Base (CDB) Subsystem of the +MGDS included data base management software comprised +of metadata and file management, file transfer capabilities, +user interfaces and data storage facilities to support multimission +telemetry data streams for current and future planetary +missions. This demanded that the CDB architecture +adhere to the architectural principles of extensibility, scalability, +and reusability. Because the CDB was and is part of +a larger system that included controlled, centralized hardware, +these architectural principles of CDB were satisfied +for AMMOS by simply ensuring that the CDB was data and +policy driven. +Our ensuing work on the Alaska SAR Facility (ASF) and +NASA Scatterometer (NSCAT) projects, made clear two +significant trends: 1) neither of these missions were part +of the controlled, centralized system for which the CDB +was developed and 2) the data management requirements +for these two missions were different from each other and +AMMOS. This meant that 1) hardware and platform choices +could not be assumed and 2) additional capabilities not originally +required for AMMOS had to be developed. In order +to meet mission schedule and cost constraints, developers +for each project independently employed a method we +coined “rapid adaptation” of the original CDB software that +resulted in two very successful mission data systems with +ultimately very few similarities or shared code. +At the time the NSCAT follow-on mission (SeaWinds on +ADEOS II) was ramping up, a technology task originally +funded by the NASA Office of Space Science was focused +on architecting and developing a common, standards-based +software framework dubbed Object Oriented Data Technology +(OODT) [12]. OODT provided “out of the box” core +data management software services while remaining adaptable +to address the (potentially evolving) requirements that +are unique from mission to mission. +Several authors of this paper supporting SeaWinds and +the OODT technology task decided to collaborate to create +a platform- and database-independent service for managing +files and tasks. The result of this collaboration was +the OODT Catalog and Archive Service component that +was architected to be reusable, reliable and scalable. The +SeaWinds (on QuikSCAT and ADEOS II) and Advanced +Communications Technology Satellite (ACTS) Mobile Terminal +(AMT) projects benefited greatly from employing +the CAS component to support their science data systems. +QuikSCAT is in its 10th year of a planned 2-year mission +and is continuing to function in a nearly lights out mode. +Hardware has been added to the system to support the unplanned +data and processing volumes (reprocessing of 7 +years of data completed in 6 months, simultaneous with +daily operations) by simply changing the software configuration. +No software engineers were required to extend the +system. +While the CAS component successfully supported Sea- +Winds and AMT, the following JPL earth missions, Orbiting +Carbon Observatory (OCO) and NPP Sounder PEATE, +needed to support far more complex processing (greatly increased +data volumes and processing throughput) and various +hardware and platform configurations. This forced us to +rethink the CAS component implementation which resulted +in 1) the refactoring of the CAS component into two distinct +components, the File Manager and the Workflow Manager +and 2) the development of a third component to provide a +standard interface to various hardware and platform configurations, +the Resource Manager. +The refactoring of the CAS into the File Manager and the +Workflow Manager components solved several issues. First, +it decoupled the initiation of a workflow from the ingestion +of a file. Therefore, while workflows can be initiated based +on the ingestion of a particular file or file type, they can also +be initiated based on other events such as a specific time of +day, an operator request or a software request. Second, the +refactoring provides developers and system designers the +ability to utilize only the components they need. And third, +the refactoring supports independent evolution of the components, +and thus capabilities. The combination of these +three refactored CAS components have come to be known +as the Process Control System, or PCS. +In addition to the File Manager, Workflow Manager +and Resource Manager components that provide common +reusable capabilities for file and metadata management, +pipeline processing and job submission, we have also developed +reusable interfaces to these components to provide +additional commonly required capabilities for science data +management systems. To support the automation of file ingestion, +we have developed a configurable push-pull framework +and crawler framework. To provide easy integration +of science code in order to support all phases of algorithm +development (testbed, operations and science computing facility), +the PCS Task Wrapper has been developed. +In this paper we will describe our core PCS components, +their architecture, how they helped us solve problems on +OCO and NPP Sounder PEATE, and how they are positioning +us for the future of Earth science mission work. We believe +such work will necessitate the same spirt of architectural +reuse, understanding and mission specific adaptation +that led to the genesis of the modern PCS and that will ultimately +lead to its future evolution. We will argue in this paper +that our PCS uniquely positions us in the state of the art +in constructing large-scale, distributed, data-intensive GDS +software for NASA Earth science missions. +The rest of this paper is organized as follows. Section 2 +provides further background and related efforts in the areas +of grid computing, workflow systems and science data systems. +Section 3 describes the core PCS architectural components +in greater detail. Section 4 presents our experience +leveraging the PCS on OCO and NPP Sounder PEATE. Section +5 rounds out the paper with conclusions and highlights +our planned future work. +2 Background and Related Work +Since the development of the computational grid [8] as +a means for the virtualization and sharing of processing +and storage resources across organizational and geographic +boundaries, many groups and organizations have recognized +the power of the grid as an enabler of large-scale scientific +research. In this paper, we discuss ongoing software +projects and research initiatives relevant to the PCS. +2.1 Grid Systems +The Globus toolkit [9], developed by The Globus Alliance, +is a collection of open-source software tools for developing +distributed computing systems and applications. +The toolkit provides users with a suite of software components +and libraries that can either be used individually or +packaged together to implement the many aspects of a distributed, +service-oriented infrastructure including security, +resource and data discovery, access, and management, and +communication modules customized for a particular gridbased +effort. +2.2 Workflow Systems +The past ten years have witnessed an explosion in the +number of workflow languages and software systems developed +to support scientific workflows. Yu and Buyya [15] +attempted to taxonomize these scientific workflow systems, +largely according the underlying technologies with which +they were built. In addition to this taxonomy, Woollard, et. +al., presented a characterization of workflow systems based +the intended scientific use [14]. Specifically, the authors +classified certain workflow systems as Production Systems, +of which both the OCO and NPP Sounder PEATE ground +data systems are examples. +2.2.1 Condor +Condor [11] is a grid-based job scheduling system developed +at the University of Wisconsin Madison which aims, +among other things, to improve the effective usage of available +distributed computing and storage resources by detecting +and exploiting machine idle cycles. Condor provides +mechanisms for job queuing, setting scheduling policies, +and general resource management and monitoring. Condor +insulates users from the particulars of the details of the underlying +infrastructure by transparently handling decisions +about when and where jobs will be scheduled, monitoring +their execution, and producing notifications of completion. +While originally designed to operate in a workstation environment, +a variant of Condor, Condor-G [10], leverages the +Globus toolkit to provide a Condor implementation that is +interoperable with Globus-based grids. +2.2.2 Pegasus +Pegasus [7] is similar to Condor in that it provides a layer of +abstraction between the jobs to be processed and the hardware +that they will eventually be processed on. Developed +at the USC Information Science Pegasus is capable of dynamically +assigning computational workflows with multiple +processing steps to a large number of grid-based compute +nodes based on resource availability. In addition to generating +an initial workflow mapping, Pegasus offers the ability +to transparently remap a workflow, increasing the reliability +of the system in the event of failure in a small number of +compute nodes. +2.3 Science Data Processing Systems +Science Data Processing Systems provide the base level +of service needed to effectively manage the vast quantities +of intermediate and final data products generated by largescale, +computationally intensive research tasks. While there +are a large number of systems in operation, we focus our +discussion on those which provide services distinctly similar +to the PCS. +2.3.1 S4PA +The Simple, Scalable, Script-based Science Product +Archive (S4PA) [3], is a storage architecture developed and +deployed at NASAs Goddard Space Flight Center in support +of the operation of the Goddard Earth Science Data +and Information Services Center (GES DISC). As cost was +a primary factor in the development of S4PA, the developers +have taken pains to streamline the system. Hosting the +primary copy of all data online reduced the need for costly +physical media distribution, and utilizing the UNIX directory +structure, in combination with metadata-encoded filenames, +provides a simplified mechanism for archive and retrieval. +As its name implies, the S4PA is primarily a data archive +service. The PCS, as described in this paper, addresses data +archiving, but takes a more architecturally grounded approach, +eschewing scripts in favor of first-class architectural +components and connectors to implement complete, endto- +end data processing pipelines. Furthermore, as complete +science data processing pipelines are composed of a large +number of complimentary, interconnected services, a formal +architectural underpinning helps to provide unity and +cohesion among the constituent components. +2.4 Standards +Grid-based science data processing systems have matured +sufficiently for common themes, lessons, and challenges +to emerge among the many participants. As a result, +there are several ongoing efforts to codify the shared knowledge +and experience into formal standards. We discuss the +Open Grid Framework and the Open Archives Initiatives +Protocol for Metadata Harvesting. +2.4.1 OGF +The Open Grid Forum [2] is actively developing standards +and specifications with the goal of spreading the adoption +of grid-based software systems. The OGF is comprised +of business, government, scientific, and academic organizations +and focuses on interoperability as the key to expanding +the utilization of grids. Through both advocacy and policy, +the OGF represents an independent voice on the role of +grids, and their potential to aid modern research. +2.4.2 OAI +The Open Archives Initiative [1] also promotes standards +for interoperability and has developed, among others, the +Protocol for Metadata Harvesting (OMI-PMH). The goal +of the OMI-PMH is to improve application interoperability +by enabling consistency in the way metadata (data about +data) is exposed, accessed, and interpreted. By providing +a flexible, extensible standard interface to the rich array +of application-specific metadata currently stored in nonuniform, +distributed repositories, the OAI hopes to facilitate +the broader accessibility and usability of distributed data resources. +3 PCS Core Architecture +In this section, we describe the PCS core components. +The three PCS manager components, File Manager, Workflow +Manager, and Resource Manager, are daemon-like web +service components responsible for answering basic questions +regarding file locations, metadata, task control and +data flow, and resource availability, monitoring, and usage. +The three PCS frameworks together implement one of +two critical higher level services in data processing systems: +(1) managing the ingestion and acquisition of remotely acquired +datasets, handled via the Crawler Framework and +Push Pull components ; and (2) managing pipeline processing, +product ingestion and data production, handled via the +PCS Task Wrapper. We will describe each component in +greater detail below. The overall PCS architecture described +in this architecture is given in Fig. 1. +3.1 File Manager +The File Manager component is responsible for tracking, +ingesting and moving file data and metadata between a +client system and a server system. The File Manager is an +extensible software component that provides an XML-RPC +external interface, and a fully tailorable Java-based API for +file management. The critical objects managed by the File +Manager include: +Products - Collections of one or more files, and their associated +Metadata. +Metadata - A map of key to multiple values of descriptive +information about a Product. +References - Pointers to a Product file’s original location, +and to its final resting location within the archive constructed +by the File Manager. +Product Type - Descriptive information about a Product +that includes what type of file Uniform Resource Identifier +(URI) [5] generation scheme to use, the root +repository location for a particular Product, and a description +of the Product. +Element - A singular Metadata element, such as “Author”, +or “Creator”. Elements may have additional metadata, +in the form of the associated definition and even a corresponding +Dublin Core [4] attribute. +Versioner - A URI generation scheme for Product Types +that defines the location within the archive (built by +the File Manager) where a file belonging to a Product +(that belongs to the associated Product Type) should be +placed. +Each Product contains one or more References, and one +Metadata object. Each Product is a member of a single +Product Type. The Metadata collected for each Product is +defined by a mapping of Product Type to one or more Elements. +Each Product Type has an associated Versioner. +3.2 Workflow Manager +TheWorkflow Manager component is responsible for description, +execution, and monitoring of Workflows, using a +client, and a server system. Workflows are typically considered +to be sequences of tasks, joined together by control +flow, and data flow, that must execute in some ordered +fashion. Workflows typically generate output data, perform +routine management tasks (such as email, etc.), or describe +a business’s internal routine practices [14]. The Workflow +Manager is an extensible software component that provides +an XML-RPC external interface, and a fully tailorable Javabased +API for workflow management. The critical objects +managed by the Workflow Manager include: +Events - are what triggerWorkflows to be executed. Events +are named, and contain dynamic Metadata information, +passed in by the user. +Metadata - a dynamic set of properties, and values, provided +to a WorkflowInstance via a user-triggered +Event. +Workflow - a description of both the control flow, and data +flow of a sequence of tasks (or stages that must be executed +in some order. +Workflow Instance - an instance of a Workflow, typically +containing additional runtime descriptive information, +such as start time, end time, task wall clock time, etc. +A WorkflowInstance also contains a shared Metadata +context, passed in by the user who triggered theWorkflow. +This context can be read/written to by the underlying +WorkflowTasks, present in a Workflow. +Workflow Tasks - descriptions of data flow, and an underlying +process, or stage, that is part of a Workflow. +Workflow Task Instances - the actual executing code, or +process, that performs the work in the Workflow Task. +Workflow Task Configuration - static configuration +properties, that configure a WorkflowTask. +Workflow Conditions - any pre (or post) conditions on the +execution of a WorkflowTask. +Workflow Condition Instances - the actual executing +code, or process, that performs the work in the Workflow +Condition. +Each Event initiates one or more Workflow Instances, +providing a Metadata context (submitted by an external +user). Each Workflow Instance is a run-time execution +model of a Workflow. Each Workflow contains one or +more Workflow Tasks. Each Workflow Task contains a single +Workflow Task Configuration, and one or more Workflow +Conditions. Each Workflow Task has a corresponding +Workflow Task Instance (that it models), as does each +Workflow Condition have a corresponding Workflow Condition +Instance. +3.3 Resource Manager +The Resource Manager component is responsible for excecution, +monitoring and traacking of jobs, storage and networking +resources for an underlying set of hardware resources. +The Resource Manager is an extensible software +component that provides an XML-RPC external interface, +and a fully tailorable Java-based API for resource management. +The critical objects managed by the Resource Manager +include: +Job - an abstract representation of an execution unit, that +stores information about an underlying program, or execution +that must be run on some hardware node ,including +information about the Job Input that the Job +requires, information about the job load, and the queue +that the job should be submitted to. +Job Input - an abstrct representation of the input that a Job +requires. +Job Spec - a complete specification of a Job, including its +Job Input, and the Job definition itself. +Job Instance - the physical code that performs the underlying +job execution. +Resource Node - an available execution node that a Job is +sent to by the Resource Manager. +Each Job Spec contains exactly one Job, and Job Input. +Each Job Input is provided to a single Job. Each Job describes +a single Job Instance. And finally, each Job is sent +to exactly one Resource Node. +3.4 Crawler Framework +The Crawler Framework was an effort to standardize the +common ingestion activities that occur both in data acquisition +and archival, as well as those that occur in pipeline +processing. These types of activities regularly involve identification +of files and directories to crawl (based on e.g., +mime type, regular expressions, or direct user input), satisfaction +of ingestion pre-conditions (e.g., the current crawled +file has not been previously ingested), followed by metadata +extraction. After metadata extraction, crawled data follows +a standard three state lifecycle: (1) preIngestion - where +e.g., a file may be unzipped or pre-processed prior to ingestion; +(2) postIngest success, indicating a successful ingestion +has occurred and e.g., the origin data file from the +ingest area should be deleted; and (3) postIngest failure, indicating +that ingestion was not successful and some corrective +action, e.g,. moving the failed file to a failure area for +later examination, should occur. +To date, we have identified three types of Product +Crawlers, where each Crawler varies along the lines of customized +precondition verification, crawilng strategy, and +need for metadata extraction. The StdProductCrawler assumes +that a Metadata object has already been generated +and included with a Product prior to ingestion, so no further +work is required to generate Metadata from a Product – +the Product is ready to be ingested. The MetExtractorProductCrawler +is responsible for generating a Metadata object +dynamically, as files are encountered during the crawling +process. Finally, the AutoDetectCrawler uses a content +type identification and regular-expressions to identify Product +Types dynamically, and then defaults to the behavior of +the MetExtractorProductCrawler for Product Types identified +via content detection. The critical objects managed by +the Crawler Framework are: +Crawler Action - is attached to one or more of the three +phases, and when a ProductCrawler enters a given +phases, all the CrawlerActions attached to that phase +are executed. The valid phases are: preIngest, +postIngestSuccess and postIngestFailure. +Precondition Comparator - is used by MetExtractorProductCrawler +and AutoDetectProductCrawler. They are +part of those ProductCrawlers customized implementation +of precondition verification that identify appropriate +times to stifle or allow metadata extractor and +ultimately ingestion, to occur. +Metadata Extractor - is run by the MetExtractorProductCrawler +and the AutoDetectProductCrawler to +generate Metadata for a Product file based on some +business rules and logic. +3.5 Push Pull Framework +The Crawler Framework supports many generic ingestion +services, including metadata extraction, crawling, and +ingestion, however, one service that necessitated further +work was the development of a protocol layer allowing +a ProductCrawler to obtain content using protocol plugins +that download content using implementations of remote +protocols such as HTTP, FTP, WinNT file system, HTTPS, +etc. +The Push Pull Framework is responsible for remote data +acquisition and acceptance over modern web protocols, +such as those mentioned above. The Push Pull Framework +is flexible in that it provides the ability to plug in different +Metadata Extractors, Data Protocols, Content Types, +etc. The framework supports parallel file transfers and data +downloads, email-based push data acceptance using IMAP, +SMTP protocols, and the ability to configure “Virtual” remote +directories (based on Metadata such as Date/Time) +from which files can be downloaded. +The critical objects managed by the Push Pull Framework +are: +Retrieval Method - defines the manner in which files are +retrieved from remote sites. It is given a configuration +file, a the Parser for the file, and a FileRetrievalSystem +(which handles all the complexities of multi-threaded +file downloading). There are currently two out-of-thebox +RetrievalMethods: RemoteCrawler and ListRetriever. +RemoteCrawler is a configurable remote site +directory and file regular expression filterable crawler. +ListRetriever will download a given list of file URIs +[5]. +Parser - parses a given configuration file into a Virtual- +FileStructure which is use to filter URIs to download. +Protocol - handles file transfer and communication via +some transfer protocol. Currently implemented Protocols +include: sftp, ftp, http, imaps, file (localhost). +3.6 PCS Task Wrapper +The PCS Task Wrapper framework is responsible for +standardizing the setup, process initiation, execution and +file management tasks surrounding execution of NASA +Product Generation Executives, or PGEs. PGEs codify a +scientific algorithm, some step in the overall scientific process +involved in a mission science workflow. +The PCS Task Wrapper provides a stable operating environment +to the underlying PGE during its execution lifecycle. +If the PGE requires a file, or metadata regarding the +file, the PCS Task Wrapper is responsible for delivering that +information to the PGE in a manner that meets its requirements. +If the PGE requires knowledge of upstream or downstream +PGEs in a sequence of executions, that information +is also made available, and finally if information regarding +disk space, node information such as CPU availability, etc., +is required the PCS Task Wrapper provides this information +to the underlying PGE. After this information is collected, +the PGE is executed and its output Product file and +Metadata generation is managed via the PCS Task Wrapper +framework. The PCS Task Wrapper is responsible for +marshalling output Products and Metadata back to the File +Manager for use in downstream data processing and pedigree. +In support of this, the PCS Task Wrapper leverages +the Crawler Framework to ingest (during pipeline processing) +the output Product files and Metadata produced by the +PGE. +As can be gleaned from the above discussion, the PGE +Task Wrapper is really the unifying bridge between the execution +of a step in the overall processing pipeline, and the +available PCS component services and the information that +they collectively manage. +The critical objects managed by the PCS Task Wrapper +are: +PGETaskInstance - an abstract class which contains a +generalized set of actions usually performed when running +PGEs. Every variable and method is protected, +thus allowing subclasses to easily modify just those +generalized actions which need to be customized for +different PGE. +Pge Config File Builder - builds a PgeConfig object and +set additional Metadata which codifies the information +necessary for orchestrating a PGE through its lifecycle. +The PCS Task Wrapper is based on a simple but +powerful XML syntax which allows a scientist to simply +fill out an xml file to describe the necessary steps +to execute a PGE. +Config File Property Adder - builds the Pge Config file +object and sets custom PGE Metadata. This allows +for a general PgeConfigBuilder with different Config- +FilePropertyAdders for setting PGE specific fields in +the PgeConfig object. +Science Pge Config File Writer - passes a PGE run information +via configuration files. This object allows +for any number of config files in any desired format +to be generated describing PGE input and those files +to be delivered to the PGE. The PCS Task Wrapper +provides existing implementations, including a deFigure +1. Component Interaction Within the PCS +fault XML Stylesheet Language (XSL) Transformation +based SciPgeConfigFileWriter. +Pcs Met File Writer - aids in generating Metadata objects +associated with PGE output products. +4 Experience and Evaluation +We have successfully applied the Process Control System +(PCS) to existing NASA missions: the Orbiting Carbon +Observatory (OCO) mission, and the NPP Sounder PEATE +mission. Both systems involve tasks such as high throughput +job processing, terabyte-scale data management, and +science computing facilities. +4.1 Orbiting Carbon Observatory Mission +On OCO, the mission is using the File Manager to ingest +MODIS, CloudSat and other ancillary data products +for use in the high performance Level 2 Science Algorithm. +To date, OCO has already used the PCS software to process +over four terabytes of Fourier Transform Spectrometer +(FTS) data provided by ground-based instruments located +around the country (e.g., Park falls, Montana, and Darwin, +Australia), and has used the software to support Instrument +Thermal Vacuum (TVAC) testing, processing 100% of all +data taken by the OCO instrument during TVAC. Also, the +PCS supports a science computing facility in which variants +of scientific software can be excursive prior to inclusion in +an operations Pipeline. +4.2 NPP Sounder PEATE Mission +Specifically NPP Sounder PEATE has already used the +File Manager and Workflow Manager to ingest and process +hundreds of gigabytes of IASI data (and is in preparation to +accept CRIMS data). Also on PEATE, the PCS is currently +being used to re-catalog over fifteen million existing science +data products from the NASA AIRS missions TLSCF. +In addition, the Resource Manager will be used on NPP to +support job processing across an eighty-node cluster. +4.3 Further Applications +In addition to the two aforementioned NASA missions, +the PCS framework is being leveraged on reimbursable +work for the National Cancer Institute (NCI)’s Early Detection +Research Network (EDRN) [6]. JPL leads the informatics +efforts on EDRN, and the PCS framework is being +used in the collection, annotation and dissemination of raw +scientific data supporting the early detection of cancer to +scientists across the country. +In the next year, PCS will also be used to support a new +JPL-led NASA mission, the Soil Moisture Active Passive +(SMAP) mission. The science computing facility designs +on OCO and NPP have been used to create an algorithm +testbed for SMAP scientists early in the design phase of the +mission so that software integration risks can be mitigated +during mission development [13]. +5 Conclusions and Future Work +While the norm for earth science missions has been for +each mission to develop their own one-off science data system +from scratch, the continual decrease in mission funding +combined with the exponential increase in mission complexity +(data volume and processing throughput) over the +last decade has made this approach pass´e and risky. It was +clear that the need for a new approach was eminent. +To this end, we have developed a standards-based software +framework to provide common science data system +services that yields the benefits of reuse while remaining +adaptable to address the requirements that are unique to the +customer. This reusable software is centered around the +most basic science data system functions that support file +and metadata management, workflow management, and resource +management. Additional frameworks augment the +core capabilities to provide automation for remote data acquisition, +data ingestion and standard pipeline processing. +This reusable software framework is the Process Control +System (PCS) we have described in this paper. +While the PCS has successfully supported the Orbiting +Carbon Observatory (OCO) and NPP Sounder PEATE +missions, upcoming missions in NASAs Decadal Survey +present additional challenges. The JPL-led Soil Moisture +Active Passive (SMAP) Mission (currently in formulation +phase) will be using the PCS not only for operations, but +also for the algorithm testbed and the science computing facility. +Providing the operational infrastructure to the algorithm +team early in the mission lifecycle will greatly reduce +the cost and risk of development-to-operations for the most +costly and risky aspect of most earth science data systems, +the algorithms. However, this also means that easy integration +of algorithms and dynamic workflow specification +are our current focus for extending the PCS capabilities. +Not far behind SMAP is another JPL-led mission, Deformation, +Ecosystem Structure and Dynamics of Ice (DESDynI) +Mission. The challenges of DESDynI are requiring +us to consider the deployment of PCS components to support +a grid architecture, supporting distributed file management +and processing capabilities supported by centralized +access to a virtual science data system. +Acknowledgements +This effort was supported by the Jet Propulsion Laboratory, +managed by the California Institute of Technology +under a contract with the National Aeronautics and Space +Administration. +References +[1] Open archives initiative, http://www.openarchives.org. +[2] Open grid forum, http://www.ogf.org. +[3] S4pa, http://daac.gsfc.nasa.gov/techlab/s4pa/index.shtml. +[4] Dublin core metadata element set, 1999. +[5] T. Berners-Lee, R. Fielding, and L. Masinter. Uniform resource +identifiers (uri): Generic syntax. Technical Report +RFC 2396, 1998. +[6] D. Crichton, S. Kelly, C. Mattmann, Q. Xiao, J. S. Hughes, +J. Oh, M. Thornquist, D. Johnsey, S. Srivastava, L. Essermann, +and W. Bigbee. A distributed information services +architecture to support biomarker discovery in early detection +of cancer. In e-Science, page 44, 2006. +[7] E. Deelman, J. Blythe, Y. Gil, C. Kesselman, G. Mehta, +S. Patil, M.-H. Su, K. Vahi, and M. Livny. Pegasus: Mapping +Scientific Workflows onto the Grid. 2004. +[8] I. Foster. The anatomy of the grid: Enabling scalable virtual +organizations. pages 6–7, 2001. +[9] I. Foster. Globus toolkit version 4: Software for serviceoriented +systems. pages 2–13. 2005. +[10] J. Frey, T. Tannenbaum, M. Livny, I. Foster, and S. Tuecke. +Condor-g: A computation management agent for multiinstitutional +grids. Cluster Computing, 5(3):237–246, July +2002. +[11] M. J. Litzkow, M. Livny, and M.W. Mutka. Condor-a hunter +of idle workstations. pages 104–111, 1988. +[12] C. Mattmann, D. J. Crichton, N. Medvidovic, and +S. Hughes. A software architecture-based framework for +highly distributed and data intensive scientific applications. +In ICSE, pages 721–730, 2006. +[13] D. Woollard, O. ig Kwoun, T. Bicknell, S. Dunbar, and +K. Leung. A science data system approach for the smap +mission. In IEEE Radar, 2009. +[14] D. Woollard, N. Medvidovic, Y. Gil, and C. A. Mattmann. +Scientific software as workflows: From discovery to distribution. +Software, IEEE, 25(4):37–43, 2008. +[15] J. Yu and R. Buyya. A taxonomy of workflow management +systems for grid computing, Apr 2005. +View publication stats \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/A Reusable Process Control System Framework for the Orbiting Carbon Observatory and NPP Sounder PEATE missions.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..e51ead435b360e1edf0462697e2b0f8580f0530d GIT binary patch literal 86528 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∨d5a2)|olp);#dS8-7T1=IXAT>0?`tsl?1qsr)wORN4jWu`6X!%92Z&O85dl zW>yvjE4V9XqMT6)FQM_iGb-U`i?(ZoHQ$wrC>1KPbt_bEm{O5kuuHg76{RXQs#3XW zN>vo>E3VW;sZoioTcfgPN=+2(M6T3Dsf$vla?6yuDA>DPX^7I08a1fgHl-m7b~{&^ zqBJF!CY3v;G)2Mw=t@hJ7M0l3Eh_t_v_!#<>PlObHkH`ZZ7O$7X^VnA*p-eb9Z@<| z?wQgN1-rH@T~WGHqb`;ErgTNYKJQ9Tl%6O(Di2KQiGq_ssd#AD&Z(4Ag!SbltZrB> zRIIHwSwIp7>oDjwNAeF~3L1mPe=5c)~zi-1!{_*917^PR$z6hZI^E9KL4Ezafb z^L9LO$KU=Mx1O?hqj=sPglu-tXv0j|C{s4hlua^a(@fbcQ+AOlyUdi$Gi8fR*;S@& znJHUk%GQ~(%}yCc2inhjb0EDr;JA#vIpBDBX1zI(afudpWhly!%5%GKNaaO};+Q}# z=p$D~qKqV$5tWywj3gKIsw-nr#*)jJ$}3aGqF@}jG7)7W%7n^mQzoKdy_J2qbl%o`FE0_VU%&Elt=FA1Jabgvkvql&lbJixl+lTq$!b0*`P>9}w!bi(v zA#H*g7QXw#u3b_2lp@sTbBa)#FDcrt4d$dPOHr20B`Qni^3{~3 multiple value&descriptive information&AGGREGATION +See&Metadata&依赖 +See&more information&依赖 +its&location& +File Manager&what type&依赖 +File Manager&file urus generation scheme&依赖 +what type&file urus generation scheme&AGGREGATION +description&Product&AGGREGATION +element&form&依赖 +element&associated definition&依赖 +form&associated definition&AGGREGATION +element&additional metada&依赖 +A URI generation scheme&location&依赖 +A URI generation scheme&built&依赖 +A URI generation scheme&archive (&依赖 +Product&1 or more reference&依赖 +member&single Product Type&AGGREGATION +Product&single Product Type&依赖 +Product&mapping&依赖 +Product&Product Type&依赖 +mapping&Product Type&AGGREGATION +Product Type&associated Versioner&依赖 +relationship&below figure&依赖 +new&key capability&AGGREGATION +Easy management&different type&AGGREGATION +different type&Products&AGGREGATION +their&information& +their&ID& +Management&Product Types&AGGREGATION +Management&new type&依赖 +their&name& +Management&new type&依赖 +different kind&back end catalog&AGGREGATION +Catalog extension point&extension point&GENERALIZATION +Catalog extension point&product instance metada and file location information&依赖 +different type&back end data store&AGGREGATION +implementation&end database&依赖 +implementation&JDBC&依赖 +implementation&end database&依赖 +implementation&JDBC&依赖 +implementation&Catalog interface&AGGREGATION +Management&Product instance information&AGGREGATION +Management&include add , delete and update product instance information&依赖 +Management&file location&依赖 +It&Metadata and reference&依赖 +Manager&point& +different type&back end store&AGGREGATION +management&Element policy information&AGGREGATION +Element policy&instance&依赖 +Element policy&XML file&依赖 +Data Transfer&Transfer&GENERALIZATION +File Manager&different Data Transfer protocol&依赖 +Versioner extension point&different File Repository layout&依赖 +Versioner extension point&extension point&GENERALIZATION +Flat product&singular file&依赖 +collection&singular file&AGGREGATION +Products&directory&依赖 +collection&directory&AGGREGATION +File Manager&popular client-server paradigm&依赖 +File Manager&XML-RPC&依赖 +its&interface& +File Manager&File Manager client and server&依赖 +File Manager&main external interface&依赖 +little brother&SOAP&AGGREGATION +File Manager web interface&RSS-based syndication&依赖 +RSS-based syndication&Product feed&AGGREGATION +datum&status tracking&依赖 +RSS-feed&transfer&AGGREGATION +File Manager¤t Product and File transfer&依赖 +Extension Points We&file manager make use&依赖 +file manager make use&factory method pattern&AGGREGATION +interface&many implementation&依赖 +extension point&File Manager&依赖 +different implementation&interface&AGGREGATION +it&software component configuration&依赖 +it&different implementation&依赖 +it&interface&实现 +File Manager extension point&implementation&依赖 +File Manager extension point&two interface&实现 +implementation&two interface&AGGREGATION +File Manager extension point&extension factory&实现 +File Manager load&factory class&依赖 +File Manager load&factory class&依赖 +File Manager load&run-time&依赖 +File Manager load&run-time&依赖 +File Manager&example&依赖 +File Manager&database-based Catalog&依赖 +it&Lucene-based Catalog&依赖 +it&many different type&实现 +The Data Transfer extension point&Product&依赖 +The Data Transfer extension point&movement&依赖 +The Data Transfer extension point&archive&依赖 +movement&Product&AGGREGATION +Different protocol&local ( disk-based ) copy&依赖 +Different protocol&local ( disk-based ) copy&依赖 +extension point&Product Type&依赖 +extension point&element&依赖 +different URI generation scheme&file&依赖 +different URI generation scheme&final resting location&依赖 +final resting location&file&AGGREGATION +different URI generation scheme&particular Product&依赖 +definition&different URI generation scheme&AGGREGATION +Catalog Data Source&base catalog&依赖 +implementation&Catalog extension point interface&AGGREGATION +implementation&a jdbc accessible database backend&依赖 +lucene base catalog&lucene base catalog&依赖 +implementation&catalog extension point interface&AGGREGATION +implementation&catalog extension point interface&依赖 +lucene base catalog&Lucene free text index system&依赖 +implementation&catalog extension point interface&依赖 +implementation&Data Transfer interface&AGGREGATION +Apache&commons-io& +implementation&locally accessible network file system ( nfs ) disk&依赖 +implementation&XML-RPC File Manager client&依赖 +XML-RPC File Manager client&File Manager client&GENERALIZATION +implementation&XML-RPC File Manager client&依赖 +implementation&datum transfer interface&AGGREGATION +InPlace Data Transfer .&product&依赖 +implementation&product type policy information&依赖 +implementation&product type policy information&依赖 +implementation&repository manager extension point&AGGREGATION +implementation&JDBC accessible database&依赖 +implementation&JDBC accessible database&依赖 +XML file&file&GENERALIZATION +implementation&JDBC accessible database&依赖 +implementation&JDBC accessible database&依赖 +implementation&element policy information&依赖 +implementation&element policy information&依赖 +implementation&validation layer extension point&AGGREGATION +Validation Layer extension point&2 XML file&依赖 +implementation&) xml-rpc&依赖 +Validation Layer extension point&Element policy information&依赖 +implementation&( file manager client&依赖 +implementation&) xml-rpc&依赖 +implementation&Validation Layer extension point&AGGREGATION +implementation&( file manager client&依赖 +File Manager&transportation medium&依赖 +implementation&File Manager&依赖 +File Manager&use xml-rpc&依赖 +implementation&File Manager&依赖 +File Manager&use xml-rpc&依赖 +implementation&File Manager&依赖 +File Manager&transportation medium&依赖 +implementation&external server interface&AGGREGATION +XML-RPC&File Manager client&依赖 +implementation&client interface&AGGREGATION +implementation&XML-RPC File Manager server&依赖 +XML-RPC File Manager server&transportation medium&依赖 +implementation&XML-RPC File Manager server&依赖 +XML-RPC File Manager server&XML-RPC&依赖 +implementation&XML-RPC File Manager server&依赖 +several&above capability&AGGREGATION +we&that&依赖 +manager ingest use case red number&step&依赖 +manager ingest use case red number&step&依赖 +sequence&step&AGGREGATION +series&interaction&AGGREGATION +manager ingest use case red number&sequence&依赖 +manager ingest use case red number&sequence&依赖 +ingest operation&ingest&依赖 +File Manager client&Step 1&依赖 +ingest operation&a particular product&依赖 +File Manager client&ingest operation&依赖 +ingest operation&Metadata and References&依赖 +server&point& +System Interface&information&依赖 +it&path& +System Interface&made&依赖 +System Interface&Product Type policy&依赖 +Metadata&Catalog extension point&依赖 +System Interface&file reference&依赖 +Catalog extension point&catalog process&依赖 +Catalog extension point&Validation Layer&依赖 +its&Type& +first step&’s associated versioner&依赖 +Product&Versioner& +first step&’s associated versioner&依赖 +Data Transfer&client or server end&依赖 +aim&document&AGGREGATION +document&architecture&依赖 +document&constituent components , object model and key capability&依赖 +Manager&architecture& +its&model& +current implementation&extension point&AGGREGATION +overview¤t implementation&AGGREGATION +Manager&points& +we&topic&依赖 +we&topic&依赖 +we&installation , configuration , and example use&依赖 +we&installation , configuration , and example use&依赖 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt new file mode 100644 index 0000000..98281ef --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt @@ -0,0 +1,109 @@ +Catalog and Archive File Management Component +Introduction +Project Description +Architecture +Extension Points +Current Extension Point Implementations +Use Cases +Conclusion +This is the developer guide for the Apache OODT Catalog and Archive Service (CAS) File Manager component, or File Manager for short. Primarily, this guide will explain the File Manager architecture and interfaces, including its tailorable extension points. For information on installation, configuration, and examples, please see our User Guides. + +The remainder of this guide is separated into the following sections: + +Project Description +Architecture +Extension Points +Current Extension Point Implementations +Project Description +The File Manager component is responsible for tracking, ingesting and moving file data and metadata between a client system and a server system. The File Manager is an extensible software component that provides an XML-RPC external interface, and a fully tailorable Java-based API for file management. + +Architecture +In this section, we will describe the architecture of the File Manager, including its constituent components, object model, and key capabilities. + +Components +The major components of the File Manager are the Client and Server, the Repository Manager, the Catalog, the Validation Layer, the Versioner, and the Transferer. The relationship between all of these components are shown in the diagram below: + +File Manager Architecture + +The File Manager Server contains both a Repository that manages products (and the products' location in the archive as specified by Versioner), and a Catalog that validates metadata via the Validation Layer. Transfer of data products from the Client to the Server is the domain of the Transfer and can be initiated at either the Client or the Server. + +Object Model +The critical objects managed by the File Manager include: + +Products - Collections of one or more files, and their associated Metadata. +Metadata - A map of key->multiple values of descriptive information about a Product. See CAS-Metadata for more information on Metadata. +Reference - A pointer to a Product file's (or files') original location, and to its final resting location within the archive constructed by the File Manager. +Product Type - Descriptive information about a Product that includes what type of file URI generation scheme to use, the root repository location for a particular Product, and a description of the Product. +Element - A singular Metadata element, such as "Author", or "Creator". Elements may have additional metadata, in the form of the associated definition and even a corresponding Dublin Core attribute. See CAS-Metadata for more information on Metadata Elements. +Versioner - A URI generation scheme for Product Types that defines the location within the archive (built by the File Manager) where a file belonging to a Product (that belongs to the associated Product Type) should be placed. +Each Product contains 1 or more References, and one Metadata object. Each Product is a member of a single Product Type. The Metadata collected for each Product is defined by a mapping of Product Type->1...* Elements. Each Product Type has an associated Versioner. These relationships are shown in the below figure. + +File Manager Object Model +Key Capabilities +The File manager has been designed with a new of key capabilities in mind. These capabilities include: + +Easy management of different types of Products. The Repository Manager extension point is responsible for managing Product Types, and their associated information. Management of Product Types includes adding new types, deleting and updating existing types, and retrieving Product Type Objects, by their ID or by their name. + +Support for different kinds of back end catalogs. The Catalog extension point allows Product instance metadata and file location information to be stored in different types of back end data stores quite easily. Existing implementations of the Catalog interface include a JDBC based back end database, along with a flat-file index powered by Lucene. + +Management of Product instance information. Management includes adding, deleting and updating product instance information, including file locations (References), along with Product Metadata. It also includes retrieving Metadata and References associated with existing Products as well as obtaining the Products themselves. + +Element management for Metadata. The File Manager's Validation Layer extension point allows for the management of Element policy information in different types of back end stores. For instance, Element policy could be stored in XML files, a Database, or a Metadata Registry. + +Data transfer mechanism interface. By having an extension point for Data Transfer, the File Manager can support different Data Transfer protocols, both local and remote. + +Advanced support for File Repository layouts. The Versioner extension point allows for different File Repository layouts based on Product Types. + +Support for multiple Product structures. The File Manager Client allows for Products to be Flat, or Hierarchical-based. Flat products are collections of singular files that are aggregated together to make a Product. Hierarchical Products are Products that contain collections of directories, and sub-directories, and files. + +Design for scalability. The File Manager uses the popular client-server paradigm, allowing new File Manager servers to be instantiated, as needed, without affecting the File Manager clients, and vice-versa. + +Standard communication protocols. The File Manager uses XML-RPC as its main external interface between the File Manager client and server. XML-RPC, the little brother of SOAP, is fast, extensible, and uses the underlying HTTP protocol for data transfer. + +RSS-based Product syndication. The File Manager web interface allows for the RSS-based syndication of Product feeds based on Product Type. + +Data transfer status tracking. The File Manager tracks all current Product and File transfers and even publishes an RSS-feed of existing transfers. + +This capability set is not exhaustive, and is meant to give the user a feel for what general features are provided by the File Manager. Most likely the user will find that the File Manager provides many other capabilities besides those described here. + +Extension Points +We have constructed the File Manager making use of the factory method pattern to provide multiple extension points for the File Manager. An extension point is an interface within the File Manager that can have many implementations. This is particularly useful when it comes to software component configuration because it allows different implementations of an existing interface to be selected at deployment time. + +The factory method pattern is a creational pattern common to object oriented design. Each File Manager extension point involves the implementation of two interfaces: an extension factory and an extension implementation. At run-time, the File Manager loads a properties file specifies a factory class to use during extension point instantiation. For example, the File Manager may communicate with a database-based Catalog and an XML-based Element Store (called a Validation Layer), or it may use a Lucene-based Catalog and a database-based Validation Layer. +Using extension points, it is fairly simple to support many different types of what are typically referred to as "plug-in architectures." Each of the core extension points for the File Manager is described below: + +Catalog The Catalog extension point is responsible for storing all the instance data for Products, Metadata, and for file References. Additionally, the Catalog provides a query capability for Products. +Data Transfer The Data Transfer extension point allows for the movement of a Product to and from the archive managed by the File Manager component. Different protocols for Data Transfer may include local (disk-based) copy, or remote XML-RPC based transfer across networked machines. +Repository Manager The Repository Manager extension point provides a means for managing all of the policy information (i.e., the Product Types and their associated information) for Products managed by the File Manager. +Validation Layer The Validation Layer extension point allows for the querying of element definitions associated with a particular Product Type. The extension point also maps Product Type to Elements. +Versioning The Versioning extension point allows for the definition of different URI generation schemes that define the final resting location of files for a particular Product. +System The extension point that provides the external interface to the File Manager services. This includes the File Manager server interface, as well as the associated File Manager client interface, that communicates with the server. +Current Extension Point Implementations +There are at least two implementations of all of the aforementioned extension points for the File Manager. Each extension point implementation is detailed in this section. + +Catalog +Data Source based Catalog. An implementation of the Catalog extension point interface that uses a JDBC accessible database backend. +Lucene based Catalog. An implementation of the Catalog extension point interface that uses the Lucene free text index system to store Product instance information. +Data Transfer +Local Data Transfer. An implementation of the Data Transfer interface that uses Apache's commons-io to perform local, disk based filesystem data transfer. This implementation also supports locally accessible Network File System (NFS) disks. +Remote Data Transfer. An implementation of the Data Transfer interface that uses the XML-RPC File Manager client to transfer files to a remote XML-RPC File Manager server. +InPlace Data Transfer. An implementation of the Data Transfer interface that avoids transfering any products -- this can be used in the situation where metadata about a particular product should be recorded, but no physical transfer needs to occur. +Repository Manager +Data Source based Repository Manager. An implementation of the Repository Manager extension point that stores Product Type policy information in a JDBC accessible database. +XML based Repository Manager. An implementation of the Repository Manager extension point that stores Product Type policy information in an XML file called product-types.xml +Validation Layer +Data Source based Validation Layer. An implementation of the Validation Layer extension point that stores Element policy information in a JDBC accessible database. +XML based Validation Layer. An implementation of the Validation Layer extension point that stores Element policy information in 2 XML files called elements.xml and product-type-element-map.xml +System (File Manager client and File Manager server) +XML-RPC based File Manager server. An implementation of the external server interface for the File Manager that uses XML-RPC as the transportation medium. +XML-RPC based File Manager client. An implementation of the client interface for the XML-RPC File Manager server that uses XML-RPC as the transportation medium. +Use Cases +The File Manager was built to support several of the above capabilities outlined in Section 3. In particular there were several use cases that we wanted to support, some of which are described below. + +File Manager Ingest Use Case +The red numbers in the above Figure correspond to a sequence of steps that occurs and a series of interactions between the different File Manager extension points in order to perform the file ingestion activity. In Step 1, a File Manager client is invoked for the ingest operation, which sends Metadata and References for a particular Product to ingest to the File Manager server’s System Interface extension point. The System Interface uses the information about Product Type policy made available by the Repository Manager in order to understand whether or not the product should be transferred, where it’s root repository path should be, and so on. The System Interface then catalogs the file References and Metadata using the Catalog extension point. During this catalog process, the Catalog extension point uses the Validation Layer to determine which Elements should be extracted for the particular Product, based upon its Product Type. After that, Data Transfer is initiated either at the client or server end, and the first step to Data Transfer is using the Product’s associated Versioner to generate final file References. After final file References have been determined, the file data is transferred by the server or by the client, using the Data Transfer extension point. + +Conclusion +The aim of this document is to provide information relevant to developers about the CAS File Manager. Specifically, this document has described the File Manager's architecture, including its constituent components, object model and key capabilities. Additionally, the this document provides an overview of the current implementations of the File Manager's extension points. + +In the Basic User Guide and Advanced User Guide, we will cover topics like installation, configuration, and example uses as well as advanced topics like scaling and other tips and tricks. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Catalog and Archive File Management Component.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..3214e495f6c85d9cd627ada1113d1fba90949502 GIT binary patch literal 33280 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\{+i+~hu>%L&{qXa@ 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 MQuV{n@2v-Z1JH~#+W-In literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester-relation.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester-relation.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt new file mode 100644 index 0000000..64874cd --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt @@ -0,0 +1,26 @@ +Catalog and Archive File Management Component 0.12 API +Packages +Package Description +org.apache.oodt.cas.filemgr.catalog +org.apache.oodt.cas.filemgr.catalog.solr +org.apache.oodt.cas.filemgr.cli.action +org.apache.oodt.cas.filemgr.datatransfer +org.apache.oodt.cas.filemgr.exceptions +org.apache.oodt.cas.filemgr.ingest +org.apache.oodt.cas.filemgr.metadata +org.apache.oodt.cas.filemgr.metadata.extractors +org.apache.oodt.cas.filemgr.metadata.extractors.examples +org.apache.oodt.cas.filemgr.repository +org.apache.oodt.cas.filemgr.structs +org.apache.oodt.cas.filemgr.structs.exceptions +org.apache.oodt.cas.filemgr.structs.query +org.apache.oodt.cas.filemgr.structs.query.conv +org.apache.oodt.cas.filemgr.structs.query.filter +org.apache.oodt.cas.filemgr.structs.type +org.apache.oodt.cas.filemgr.structs.type.examples +org.apache.oodt.cas.filemgr.system +org.apache.oodt.cas.filemgr.system.auth +org.apache.oodt.cas.filemgr.tools +org.apache.oodt.cas.filemgr.util +org.apache.oodt.cas.filemgr.validation +org.apache.oodt.cas.filemgr.versioning \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Interface Ingester.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..66d262bc44c34e8f4af29a28dbc6872c008f64c3 GIT binary patch literal 4096 zcmeHK%}-N75TEyWr66DBLs1lH3Pf6}qS3@iu%M9W!H)n&6EwBJi=c#JsU}>sDqf5x zCM2G`aP;EGMPoEZZXQT9dLYqD@jo!p#2DfEo7wkht3W&$Kag!^cjq^=JNtHbX11?h z7AGejRLszKrHQg=&dR0iG+ayTlZQwL&)A%0SuEl{x+~=$+JO#=;uj|`wbKyV7>)8# z{&ZPGF3tJejQg>`3@2N@j9+^!R<-*c~Wb8w2;E_&mca<}4a*!O2}BkmiM zaxdP4KTgBAAKJcKkIm{sBYmg6zoG1rHAFPNo6S<+22zOo#0a83>QbriiS((`grr|9 z)Q<0ZRiseMuxqSokJp<&0~5?dFTKpABjsK05*j_b-A67r_II;JH8Gc3iJe{+$D$d$# zk=zR;0_LOcLoVlNSS)eSgE_z6`SAKc&*4y5@PObAQePG%Az!ZMtiv87YSJZ0CJpBW za7DDoq@ExjX72;>Pp6<3v=@>LsX3A%jgCNqz0~<_q5es#_eYM-uMFT4OSD@rp@*zM ZEnL~95_&v8inGOh96y!hWz-+6z5!Zms~`XX literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker-relation.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker-relation.txt new file mode 100644 index 0000000..94de539 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker-relation.txt @@ -0,0 +1,664 @@ +L’archiveouvertepluridisciplinaire HAL&deslaboratoire public oupriv�s&依赖 +L’archiveouvertepluridisciplinaire HAL&deslaboratoire public oupriv�s&依赖 +L’archiveouvertepluridisciplinaire HAL&deslaboratoire public oupriv�s&依赖 +Modern day system&avalanche&依赖 +avalanche&datum&AGGREGATION +Modern day system&datum&依赖 +datum&many forms and shape&依赖 +weather sensor&large amount&依赖 +weather sensor&datum&依赖 +weather sensor&year&依赖 +weather sensor&datum&依赖 +weather sensor&large amount&依赖 +weather sensor&large amount&依赖 +weather sensor&year&依赖 +weather sensor&datum&依赖 +weather sensor&year&依赖 +weather sensor&year&依赖 +large amount&datum&AGGREGATION +weather sensor&large amount&依赖 +weather sensor&datum&依赖 +similar datum&scalable , efficient , reliable and very large storage&依赖 +similar datum&scalable , efficient , reliable and very large storage&依赖 +similar datum&efficient metada&依赖 +paper&built&依赖 +paper&high volume datum intensive application&依赖 +paper&high volume datum intensive application&依赖 +paper&built&依赖 +paper&present mahasen&依赖 +paper&built&依赖 +top&peer-to-peer layer&AGGREGATION +paper&present mahasen&依赖 +paper&high volume datum intensive application&依赖 +paper&present mahasen&依赖 +Mahasen&weather datum&依赖 +top&distribute hash table ( dht ) 1 introduction currently united states&AGGREGATION +sizable amount&datum&AGGREGATION +sensor&datum&依赖 +sensor&sizable amount&依赖 +Processing&understanding&依赖 +its&limits& +our&understanding& +Processing&large-scale data process&依赖 +Processing&large-scale data process&依赖 +Processing&understanding&依赖 +prominent one&many challenge datum&依赖 +scientist and researcher&specific type&依赖 +specific type&datum&AGGREGATION +scientist and researcher&datum&依赖 +prominent one&datum&依赖 +scientist&Automated Weather data item&依赖 +scientist&8am-12pm&依赖 +scientist&example&依赖 +we&example&依赖 +we&meteorology&依赖 +Sky server [ 1 ]&instance&依赖 +best example&use case&依赖 +best example&large data generation&依赖 +one&best example&AGGREGATION +use case&large data generation&AGGREGATION +Sky server [ 1 ]&best example&依赖 +40 terabyte&datum&AGGREGATION +project&datum&依赖 +project&40 terabyte&依赖 +its&collection& +similarly many science&large amount&依赖 +similarly many science&large amount&依赖 +similarly many science&datum&依赖 +similarly many science&large amount&依赖 +similarly many science&datum&依赖 +similarly many science&datum&依赖 +system&file&依赖 +system&datum&依赖 +[ 2 ] [ 3 ] and storage solution&4 ] [ 5 ]&依赖 +we&related work section&依赖 +most¢ralized architecture&依赖 +most&metadata catalog implementation&AGGREGATION +most¢ralized architecture&实现 +vendor&mechanism& +centralized metadata catalog&’s mechanism&依赖 +Nirvana Storage [ 7 ]¢ralized metadata catalog&依赖 +centralized metadata catalog&scalability&依赖 +centralized metadata catalog&Oracle Real Application cluster&依赖 +Nirvana Storage [ 7 ]&example&依赖 +store&which&依赖 +store&hierarchical rich metada&依赖 +paper&scalable metadata catalog and storage server&依赖 +top&P2P technology&AGGREGATION +paper&Mahasen&依赖 +storage server&server&GENERALIZATION +paper&built&依赖 +a datum grid management system ( dgms )&distributed datum&依赖 +a datum grid management system ( dgms )&large volume&依赖 +large volume&distributed datum&AGGREGATION +It&high volume data intensive application&依赖 +architecture&Mahasen&AGGREGATION +its&attributes& +it&metadata structure&依赖 +It&storage server&依赖 +dual purpose&metadata catalog&AGGREGATION +network&dual purpose&依赖 +network&storage server&AGGREGATION +network&metadata catalog&依赖 +Mahasen&huge data storage problem and fault tolerance&依赖 +Mahasen&data intensive compute&依赖 +single point&failure&AGGREGATION +Metadata management&search file&依赖 +Metadata management&capability&依赖 +attribute&stored resource&AGGREGATION +Mahasen&metadata catalog&依赖 +metadata layer&fault tolerance&依赖 +metadata layer&replica&依赖 +metadata layer&metada&依赖 +replica&metada&AGGREGATION +rest&paper&AGGREGATION +rest&follow&依赖 +next section&related work&依赖 +next section&Metadata catalog&依赖 +section&Mahasen architecture&依赖 +Mahasen architecture&architecture&GENERALIZATION +performance evaluation&Mahasen&AGGREGATION +next section&Mahasen&依赖 +next section&performance evaluation&依赖 +discussion section§ion&GENERALIZATION +discussion section&limitation&依赖 +middleware system&large heterogeneous data resource&依赖 +centralized metadata repository&two type&依赖 +two type&records – system&AGGREGATION +centralized metadata repository&records – system&依赖 +vendor&mechanisms& +Scalability&MCAT&AGGREGATION +stored resource&Physical resource&依赖 +Replication&availability and recoverability&依赖 +Replication&resource&依赖 +Replication&resource&依赖 +Replication&availability and recoverability&依赖 +Replication&availability and recoverability&依赖 +Replication&resource&AGGREGATION +Replication&availability and recoverability&依赖 +Replication&resource&依赖 +Replication&availability and recoverability&依赖 +Replication&availability and recoverability&依赖 +Replication&resource&依赖 +Replication&resource&依赖 +Replication&resource&依赖 +availability and recoverability&resource&AGGREGATION +data transfer process&user&依赖 +datum&two way&依赖 +datum&Registration and Ingestion&依赖 +Registration&datum&依赖 +Ingestion®istration&依赖 +file resource&resource&GENERALIZATION +srb then file&MCAT&依赖 +a datum object&file resource&依赖 +2.2 Apache OODT OODT [ 10 ]&metada&依赖 +functionality&distribute datum , object and database&依赖 +functionality&distribute datum , object and database&依赖 +product service and profile service&data and metada&依赖 +OODT&file-based storage&依赖 +OODT&distributed manner&依赖 +OODT&data product&依赖 +They&three category&依赖 +They&on-line , near-line or off-line storage&依赖 +They&storage&依赖 +OODT&request&依赖 +it&profile query&依赖 +it&product server&依赖 +OODT&file&依赖 +product server&server&GENERALIZATION +form&URI&AGGREGATION +target product server address&form&AGGREGATION +response&URI&依赖 +it&datum&依赖 +it&product server&依赖 +it&product server&依赖 +oodt issue&product query&依赖 +oodt issue&product query&依赖 +it&datum&依赖 +oodt issue&product query&依赖 +it&server&依赖 +type&server&AGGREGATION +multiple&type&AGGREGATION +OODT&profile server&依赖 +profile server&server&GENERALIZATION +it&multiple&依赖 +it&type&依赖 +it&REST-style architectural pattern&依赖 +OODT&client server architecture&依赖 +it&search&依赖 +profile&retrieval&依赖 +profile&profile&AGGREGATION +implementation&javax.sql.datasource interface&AGGREGATION +file management component&resource files and metada&依赖 +file management component&delete&实现 +file management component&resource files and metada&依赖 +file management component&resource files and metada&实现 +file management component&resource files and metada&实现 +file management component&resource files and metada&实现 +file management component&delete&实现 +file management component&resource files and metada&实现 +file management component&delete&实现 +file management component&delete&实现 +file management component&delete&依赖 +file management component&Catalog and Archive Service&AGGREGATION +file management component&delete&依赖 +delete&resource files and metada&AGGREGATION +file system&system&GENERALIZATION +javax.sql.datasource interface&resource&依赖 +javax.sql.datasource interface&user&依赖 +WSO2 Registry&metadata management feature&依赖 +user&resource&依赖 +their&properties& +user&custom property&依赖 +user&custom property&依赖 +user&resource&依赖 +WSO2 Registry&resource&依赖 +WSO2 registry&Relational Database system&依赖 +it&database feature&依赖 +datum , metada&them&依赖 +it¢ralized architecture&依赖 +Mahasen&architecture&依赖 +Mahasen&distributed architecture&依赖 +distributed architecture&architecture&GENERALIZATION +replication&resource&AGGREGATION +two type&search&AGGREGATION +One&resource&实现 +One&metadata etc.&实现 +One&name&实现 +their&name& +second one&resource&依赖 +content&resource&AGGREGATION +second one&content&依赖 +second search&resource&依赖 +second search&textual content&依赖 +textual content&content&GENERALIZATION +it&property&依赖 +property&name value pair&AGGREGATION +it&name value pair&依赖 +it&tag&依赖 +it&additional metada&依赖 +your&way& +other way&own way&依赖 +other way&own way&依赖 +major limitation&memory&依赖 +amount&memory&AGGREGATION +major limitation&memory&依赖 +available memory&megabyte&依赖 +it&java heap memory&依赖 +few hundred&megabyte&AGGREGATION +hdf&master slave architecture&依赖 +master and number&DataNodes&AGGREGATION +namespace&file system&AGGREGATION +user&directory and store file&依赖 +Hadoop&hierarchical file organization&依赖 +sequence&block&AGGREGATION +block&file system&依赖 +file system&DataNodes&AGGREGATION +It&file&依赖 +block&DataNodes&依赖 +It&chunk&依赖 +default size&64MB&AGGREGATION +block&fault tolerance&依赖 +replication factor&datum&AGGREGATION +application&streaming access&依赖 +application&data set&依赖 +their&sets& +Data node&read request&依赖 +requirement&distributed file system&AGGREGATION +file&system specific metada&依赖 +physical location&system specific metada&AGGREGATION +file&using&依赖 +it&distributed file system&依赖 +it&requirement&依赖 +hadoop address&single writer multiple readers ’ model&依赖 +one&datum&依赖 +datum&file&依赖 +file&user&依赖 +particular resource&hdf&依赖 +resource&/ trash directory&依赖 +it&trash&依赖 +resource&possibility&依赖 +its&scalability& +Mahasen&differentiation& +it&large file transfer&依赖 +scalability&system&依赖 +it&an atom base resource transfer&依赖 +It&Nirvana Storage&依赖 +they&user-defined metada&依赖 +Mahasen&layer& +hdf&single name node&依赖 +single name node&active passive failover configuration&依赖 +single name node&fault tolerant&依赖 +Mahasen&several storage node&依赖 +node&metada&依赖 +node&a registry&依赖 +node&physical file part&依赖 +node&system&依赖 +node&dht ( freepastry ) route protocol&依赖 +node&communicate&依赖 +Mahasen High Level Architecture Mahasen&WSO2 registry&依赖 +Mahasen&peer&依赖 +peer network&network&GENERALIZATION +stores datum&peer network&依赖 +stores datum&peer network&依赖 +Mahasen&distributed metadata layer&依赖 +stores datum&peer network&依赖 +two main type&metada&AGGREGATION +mahasen store&metada&依赖 +mahasen store&two main type&依赖 +System defined metada&server side resource handling&依赖 +store node ip&file&AGGREGATION +example&system-defined metada&AGGREGATION +User&tags and property ( name&依赖 +User&value pair&依赖 +User&( name&依赖 +User&tags and property ( name&依赖 +User&value pair&依赖 +User&( name&依赖 +Metadata Object Structure&Mahasen&AGGREGATION +Mahasen node&node&GENERALIZATION +Metadata Object Structure&node&依赖 +master node&node&GENERALIZATION +selected set&neighborhood node&AGGREGATION +neighborhood node&master node&AGGREGATION +split part&selected set&依赖 +split part&master node&依赖 +split part&neighborhood node&依赖 +node&master node&依赖 +split part¶llel transfer&依赖 +metadata object&Free pastry&实现 +metadata object&PAST storage implementation&依赖 +metadata object&replica&依赖 +PAST storage implementation&Free pastry&AGGREGATION +node&storage& +node&file part&依赖 +their&parts& +node&worker node&依赖 +worker node&file part&依赖 +them&system&依赖 +stored location&file part&AGGREGATION +capability&concurrent access&AGGREGATION +worker node&stored location&依赖 +worker node&node&GENERALIZATION +lock manager&DHT&AGGREGATION +worker node&metadata object&依赖 +User&Mahasen node&依赖 +node&resource ID&依赖 +node&request and&依赖 +User&file&依赖 +location&metadata object&依赖 +it&location&依赖 +location&Mahasen node&AGGREGATION +location&file part&依赖 +it&Mahasen node&依赖 +file&user&依赖 +Deletion&heterogeneous storage system&依赖 +Deletion&single command&依赖 +node&file&依赖 +node&part&依赖 +part&file&AGGREGATION +Mahasen&node&依赖 +update request&request&GENERALIZATION +node&DHT&依赖 +metadata object&replica&依赖 +node&metadata object&依赖 +user&user-defined metada&依赖 +node&update request&依赖 +node&file&依赖 +Mahasen&complete decentralized metadata system&依赖 +complete decentralized metadata system&scalable and efficient manner&依赖 +complete decentralized metadata system&metadata management&依赖 +replica&both actual file and metada object&AGGREGATION +Mahasen&both actual file and metada object&依赖 +Mahasen&replica&依赖 +main purpose&replica&AGGREGATION +high availability&metada&AGGREGATION +We&high availability&依赖 +We&metada&依赖 +pastry&DHT& +amount&datum&AGGREGATION +3.2 Mahasen&complexity&依赖 +3.2 Mahasen&search increase&依赖 +complexity&search increase&AGGREGATION +3.2 Mahasen&Mahasen&GENERALIZATION +Mahasen&that&依赖 +Mahasen&a distribute datum structure&依赖 +DHT&different search option&依赖 +DHT&performance&依赖 +Mahasen&using&依赖 +performance&different search option&AGGREGATION +we&pointing&依赖 +resource&tag or property&依赖 +we&index&依赖 +resource&metada&依赖 +replica&it&AGGREGATION +a treemap [ 16 ]&a treemap [ 16 ]&依赖 +DHT&replica&依赖 +DHT&it&依赖 +property tree&DHT&依赖 +mahasen extract&requested search&依赖 +mahasen extract&requested search&依赖 +search request&request&GENERALIZATION +execution&relevant search method&AGGREGATION +user&search request&依赖 +resource id&file&AGGREGATION +resource id&relevant property tree&依赖 +user&search request&依赖 +user&Mahasen node&依赖 +Mahasen&property name&依赖 +property name&name&GENERALIZATION +node&search request&依赖 +Mahasen&given&依赖 +it&resource id&依赖 +it&property&依赖 +current node&index&依赖 +current node&property&依赖 +node handle&node&AGGREGATION +node&specific property tree&依赖 +node&master node&依赖 +node handle&relevant resource id&依赖 +their&storage& +node handle&memory storage&依赖 +memory storage&storage&GENERALIZATION +node handle&property tree&依赖 +we&sub map&依赖 +we&sub map&依赖 +set&resource id&AGGREGATION +resource id&given property value&依赖 +resource id&file&依赖 +operation&resource id&依赖 +operation&resource id&依赖 +operation&resource id&依赖 +operation&given search query&依赖 +operation&given search query&依赖 +operation&high cost&依赖 +operation&given search query&依赖 +operation&high cost&依赖 +operation&high cost&依赖 +Complete Data Structure&property base search&依赖 +Complete Data Structure&property base search&依赖 +set&different property and tag&AGGREGATION +Mahasen Search&continuation model support&依赖 +Mahasen Search&FreePastry&依赖 +Mahasen Search&continuation model support&依赖 +Mahasen Search&FreePastry&依赖 +application&request&依赖 +node handle&request result&依赖 +application&node handle&依赖 +application&first result&依赖 +network&storage node and user&AGGREGATION +Mahasen&storage node and user&依赖 +Mahasen Client&HTTP method&依赖 +client&connection&依赖 +one&node&AGGREGATION +client&node&依赖 +client&network&依赖 +client&connection&依赖 +File content&entity&依赖 +File content&HTTP POST method&依赖 +end&file stream&依赖 +file&set&依赖 +file&predefined replication factor&依赖 +file&predefined chunk&依赖 +set&predefined chunk&AGGREGATION +reliability and performance&system&AGGREGATION +critical part&system&依赖 +critical part&reliability and performance&依赖 +placement&replica&AGGREGATION +current policy&replicated file&依赖 +current policy&set&依赖 +current policy&leaf node&依赖 +current policy&replicated file&依赖 +current policy&set&依赖 +current policy&leaf node&依赖 +current policy&Mahasen&AGGREGATION +distance&node&AGGREGATION +selection&node&AGGREGATION +client&status&依赖 +client&file transfer&依赖 +initial node&other node&依赖 +initial node&file&依赖 +status&file transfer&AGGREGATION +number©&AGGREGATION +replication factor&file&AGGREGATION +block&fault tolerance&依赖 +it&block&依赖 +it&fixed size&依赖 +block&network&依赖 +block&fixed size&AGGREGATION +system&node&依赖 +retrieval&file&AGGREGATION +user&default client&依赖 +user&external client&依赖 +default client&client&GENERALIZATION +client&upload , download , delete and search operation&依赖 +result&follow figure&依赖 +result&test&AGGREGATION +result&follow figure&依赖 +500MB size file&client&依赖 +500MB size file&upload test&依赖 +number&client increase&AGGREGATION +network congestion and background process&data replication&AGGREGATION +number&18 or 24&依赖 +number&node&AGGREGATION +number&18 or 24&依赖 +client&upload&依赖 +node&other node&依赖 +node&replica management task&依赖 +node&p2p ring&依赖 +node&replica management task&依赖 +node&other node&依赖 +node&p2p ring&依赖 +client&which&依赖 +increase&number&AGGREGATION +download file&Mahasen client&依赖 +number&client&AGGREGATION +Mahasen client&client&GENERALIZATION +single node setup&significant growth&依赖 +it&other node&依赖 +it&setup&依赖 +it&file transfer&依赖 +other available node&download time&依赖 +multiple node&system&依赖 +you&file part&依赖 +you&other available node&依赖 +Mahasen&Delete&依赖 +it&3 operation&依赖 +it&metada&依赖 +its&files& +single node&lowest possible time&依赖 +it&client&依赖 +it&aggregate result&依赖 +it&it&依赖 +we&same node&依赖 +we&same node&依赖 +search operation&operation&GENERALIZATION +we&search operation&依赖 +we&search operation&依赖 +its&architecture& +Mahasen&overall system scalable and fault tolerant&依赖 +Mahasen&metadata catalog&依赖 +Mahasen&system&依赖 +Mahasen&replication&依赖 +Mahasen&metada&依赖 +Mahasen&metada&依赖 +metadata catalog¢ralized architecture&依赖 +replica&both metadata object and property tree&AGGREGATION +Mahasen&both metadata object and property tree&依赖 +easy access&them&AGGREGATION +DHT&FreePastry&AGGREGATION +replica&actual file&依赖 +replica&metadata objects and property tree object&AGGREGATION +replica&much as keeping replica&依赖 +replica&actual file&依赖 +much as keeping replica&actual file&AGGREGATION +replica&much as keeping replica&依赖 +Mahasen&Mahasen operation&依赖 +Mahasen&many&依赖 +many&Mahasen operation&AGGREGATION +Mahasen&many&依赖 +Mahasen&correct functioning&依赖 +Mahasen&correct functioning&依赖 +correct functioning&many&AGGREGATION +Mahasen&correct functioning&依赖 +Mahasen&Mahasen operation&依赖 +Mahasen&Mahasen operation&依赖 +Mahasen&many&依赖 +important contribution&DHT&依赖 +top&DHT&AGGREGATION +important contribution&DHT&依赖 +important contribution&distributed indexing structure&依赖 +important contribution&distributed indexing structure&依赖 +important contribution&top&依赖 +important contribution&top&依赖 +important contribution&Mahasen&AGGREGATION +Mahasen&range based query&依赖 +we&earlier effort&依赖 +we&such index structure&依赖 +data structure&range based query&依赖 +we&search&依赖 +data structure&DHT&依赖 +Skip Tree Graph [ 18 ]&best candidate&依赖 +we&data structure&依赖 +one&best candidate&AGGREGATION +we&different property and datum structure&依赖 +number&entry&AGGREGATION +number&property&AGGREGATION +we&less complex solution&依赖 +we&expensive&依赖 +term&resource&AGGREGATION +it&available raw metada&依赖 +it&search operation&依赖 +large number&node&AGGREGATION +Mahasen&DHT and TreeMap&依赖 +Mahasen&combined data structure&依赖 +Mahasen&metadata object&依赖 +it&node&依赖 +network&them&依赖 +it&network&依赖 +availability&metadata object&AGGREGATION +replication factor&them&AGGREGATION +we&which&依赖 +Current Mahasen design&several limitation&依赖 +we&future work&依赖 +mahasen store&one Mahasen node&依赖 +mahasen store&property index&依赖 +memory&node&AGGREGATION +mahasen store&property index&依赖 +mahasen store&one Mahasen node&依赖 +NoSQL storage&similar assumption&依赖 +NoSQL storage&similar assumption&依赖 +We&maximum size&依赖 +We&part&依赖 +maximum size&part&AGGREGATION +one potential solution&data set&依赖 +one potential solution&size&依赖 +challenge&Mahasen&依赖 +size&data set&AGGREGATION +group&open source registry&AGGREGATION +Mahasen project&scalable storage solution&依赖 +Mahasen project&project&GENERALIZATION +user&group&依赖 +user&node&依赖 +node&group&AGGREGATION +node ( registry&storage overlay&依赖 +top&Pastry DHT algorithm&AGGREGATION +node ( registry&PAST&依赖 +property-based search&data item&AGGREGATION +Mahasen&distributed indexing structure&依赖 +Mahasen&top&依赖 +Mahasen&DHT&依赖 +user&Web Service API&依赖 +batch processing&file uploading task&AGGREGATION +SIGMOD ’00 Proceedings&2000 ACM SIGMOD international conference 2000 ) 2&AGGREGATION +2000 ACM SIGMOD international conference 2000 ) 2&datum&AGGREGATION +Management&datum&AGGREGATION +Amazon&Store& +Home and storage resource broker ( srb � )&storage resource broker ( srb � )&AGGREGATION +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&HotOS VIII&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&Schoss Elmau&依赖 +germany ( 2001 ) 16&germany ( 2001 ) 16&依赖 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt new file mode 100644 index 0000000..6741625 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt @@ -0,0 +1,141 @@ +HAL Id:hal-01513774 +https://hal.inria.fr/hal-01513774 +Submitted on25Apr2017 +HAL is amulti-disciplinaryopenaccess +archiveforthedepositanddisseminationofsci- +entificresearchdocuments,whethertheyarepub- +lished ornot.Thedocumentsmaycomefrom +teachingandresearchinstitutionsinFranceor +abroad, orfrompublicorprivateresearchcenters. +L’archiveouvertepluridisciplinaire HAL, est +destinée audépôtetàladiffusiondedocuments +scientifiquesdeniveaurecherche,publiésounon, +émanantdesétablissementsd’enseignementetde +recherchefrançaisouétrangers,deslaboratoires +publics ouprivés. +Distributed underaCreativeCommons Attribution| 4.0InternationalLicense +Mahasen: DistributedStorageResourceBroker +K. Perera,T.Kishanthan,H.Perera,D.Madola,MalakaWalpola,Srinath +Perera +Tocitethisversion: +K. Perera,T.Kishanthan,H.Perera,D.Madola,MalakaWalpola,etal..Mahasen:Distributed +Storage ResourceBroker.10thInternationalConferenceonNetworkandParallelComputing(NPC), +Sep 2013,Guiyang,China.pp.380-392,￿10.1007/978-3-642-40820-5_32￿.￿hal-01513774￿ +Mahasen: Distributed Storage Resource Broker +K.D.A.K.S.Perera1, T Kishanthan1, H.A.S.Perera1, D.T.H.V.Madola1, Malaka Walpola1, Srinath Perera2 +1 Computer Science and Engineering Department, University Of Moratuwa, Sri Lanka. {shelanrc, kshanth2101, ashansa.perera, hirunimadola, malaka.uom}@gmail.com +2 WSO2 Lanka, No 59, Flower Road, Colombo 07, Sri Lanka +srinath@wso2.com +Abstract. Modern day systems are facing an avalanche of data, and they are being forced to handle more and more data intensive use cases. These data comes in many forms and shapes: Sensors (RFID, Near Field Communication, Weather Sensors), transaction logs, Web, social networks etc. As an example, weather sensors across the world generate a large amount of data throughout the year. Handling these and similar data require scalable, efficient, reliable and very large storages with support for efficient metadata based searching. This paper present Mahasen, a highly scalable storage for high volume data intensive applications built on top of a peer-to-peer layer. In addition to scalable storage, Mahasen also supports efficient searching, built on top of the Distributed Hash table (DHT) +1 Introduction +Currently United States collects weather data from many sources like Doppler readers deployed across the country, aircrafts, mobile towers and Balloons etc. These sensors keep generating a sizable amount of data. Processing them efficiently as needed is pushing our understanding about large-scale data processing to its limits. +Among many challenges data poses, a prominent one is storing the data and indexing them so that scientist and researchers can come and ask for specific type of data collected at a given time and in a given region. For example, a scientist may want to search for all Automated Weather data items collected in Bloomington area in June 15 between 8am-12pm. +Although we have presented meteorology as an example, there are many similar use cases. For instance, Sky server [1] is one of the best examples that illustrate the use case of large data generation. This project expects to collect 40 terabytes of data in five years. In its data collection, the photometric catalog is expected to contain about 500 distinct attributes for each of one hundred million galaxies, one hundred million stars, and one million quasars. Similarly many sciences, analytic processing organizations, data mining use cases etc., would want to store large amount of data and process them later in a selective manner. These systems often store data as files +and there have been several efforts to build large scale Metadata catalogs [2][3] and storage solutions[4][5] to support storing and searching those data items. One such example is AMGA metadata catalog [6] which was an effort to build replication and distribution mechanism for metadata catalogs. +As we discuss in the related work section, most of the metadata catalog implementations use centralized architectures and therefore have limited scalability unlike Mahasen. For example, Nirvana Storage [7] has a centralized metadata catalog which only supports scalability through vendor’s mechanism such as Oracle Real Application clusters. XML Metadata Concept catalog (XMC Cat) [8] is another centralized metadata catalog which stores hierarchical rich metadata. This paper presents Mahasen, a scalable metadata catalog and storage server built on top of a P2P technology. Further, it is built by distributing an open source centralized Data registry (WSO2 Registry). +Mahasen (Distributed Storage Resource Broker) is a Data Grid Management System (DGMS) that can manage a large volume of distributed data. It targets high volume data intensive applications. The architecture of Mahasen has been designed to present a single global logical namespace across all the stored data, and it maintains a metadata structure which can be used to search files based on its’ attributes. It is a network of storage servers that plays the dual purpose of a metadata catalog and a storage server. Mahasen will solve the huge data storage problem and fault tolerance in data intensive computing through aggregating low cost hardware while having both metadata and actual resources distributed without single point of failure. Metadata management will ensure the capability of searching files based on attributes of the stored resources. Mahasen has a metadata catalog, which is highly distributed and well scalable. The metadata layer ensures fault tolerance by keeping replicas of metadata. +The rest of the paper is organized as follows. The next section will discuss the related work in Metadata catalogs and Storage servers while comparing and contrasting them with Mahasen. The following section will discuss Mahasen architecture. The next section will present the performance evaluation of Mahasen. Finally the discussion section discusses limitations, other potential solutions and directions. +2 Related Work +2.1 Nirvana Storage +Nirvana SRB [7] is a middleware system that federates large heterogeneous data resources distributed across a network. The ability to access, manage, search and organize data across the entire SRB Federation is provided via a Global Namespace. MCAT is the centralized metadata repository which maintains two types of records – system- and user-metadata. Scalability of MCAT is achieved using database vendor’s mechanisms [9], hence limited by Relational DB scalability Limits. +Storage/Replication. The stored resources are divided as Physical resources, Logical resources and Cluster resources. Replication of resources across multiple servers ensures the availability and recoverability of resources during failovers. +Retrieve. Data stream routing is handled by SRB and TCP/IP, making the data transfer process transparent to the users.. +Search. Searching is done based on metadata attributes which are extracted and managed by the SRB. +Add/Update. Data can be added in two ways: Registration and Ingestion. Registration does not transfer any data but only creates a pointer to the data in MCAT. Ingestion is similar to registration but also transfers the data to an SRB storage resource. +Delete. If a file shadow object is used as a data object to ingest a file resource to SRB then file will be removed from MCAT but not from the physical location. +2.2 Apache OODT +OODT[10] is a middleware system for metadata that provides transparent access to the resources. It facilitates functionalities such as store, retrieve, search and analyze distributed data, objects and databases jointly. OODT provides a product service and profile service which manage data and metadata respectively. +Storage/Replication. OODT stores data product in a file-based storage in a distributed manner. They classify storage into three categories: on-line, near-line or off-line storage. +Retrieve. When OODT receives a request for retrieving a file, it issues a profile query to a product server that helps in resolving resources that could provide data. The response will include the target product server address in the form of a URI. The OODT issues a product query based on the profile query results to get the data, and it will actually retrieve data from the product server in a MIME-compliant format. +Search. OODT uses the profile server and the product server for searching the metadata and retrieve the products, and it has multiple of each type of server. OODT is based on client server architecture and it promotes REST-style architectural pattern for search and retrieve data. The profile or a subset of profile is returned for retrieval. +Add/Update. OODT provide data management including manage files and folders with the implementation of javax.sql.datasource interface. +Delete. The file management component of a Catalog and Archive Service support the delete of resource files and metadata through the implementation of javax.sql.datasource interface. +2.3 WSO2 Governance Registry +WSO2 Governance Registry [11] is a repository that allows users to store resources in a tree-structured manner, just like with a file system. However, unlike a file system, users may annotate resources using their custom properties, and also WSO2 Registry has built in metadata management features like tagging, associating resources. +However, WSO2 registry is backed by a Relational Database system, and it uses database features to store data, metadata, to manage them, and to search. Hence it has a centralized architecture. Mahasen extends that architecture to a distributed architecture. +Replication. There is no inbuilt mechanism to do the replication of resources in WSO2 registry. +Search. The WSO2 registry provides two types of searches. One is searching for a resource with their name, metadata etc., and it is implemented using underline relational database system. The second one is searching the content of resources, and implemented using Lucene [12]. The second search is only applicable to resources with textual content. +Add/Update. Adding of resources to registry can be done in two ways. First one is adding via the web interface provided by the registry. When adding a new resource, it is also possible to add additional metadata such as tags, properties of name value pairs, which later will be useful to search for that resource. The other way to add resources is by writing your own way by extending the registry API and exposing it as a web service. +The major limitation with registry, when storing resources, is the amount of memory available. Since it uses the java heap memory to buffer the resources before storing them, large files cannot be stored as the available memory is only limited to few hundred of megabytes. +2.4 Hadoop Distributed File System +Apache Hadoop Distributed File System is (HDFS)[13] is a file system designed to run on commodity hardware. HDFS has a master slave architecture that consists of a single NameNode as master and number of DataNodes. The NameNode is responsible of regulating access to files by client and managing the namespace of the file system. Generally DataNodes are deployed one per node in the cluster, and is responsible of managing storage attached to that node. +Storage / Replication. Hadoop supports hierarchical file organization where user can create directories and store files. It splits the file in to chunks with the default size of 64MB and stores them as sequence of blocks, and those blocks are stored in underlying file system of DataNodes. Those blocks are replicated for fault tolerance and the block size and the replication factor of data are configurable. +Retrieve. Applications that run on HDFS need streaming access to their data sets. Data nodes will be responsible for the read requests that issued from a user to retrieve data from the system. +Search. Hadoop Distributed File System does not provide a comprehensive search for users or applications, and it just fulfill the requirement of a distributed file system by supporting to locate the physical location of the file using the system specific metadata. +Add/Update. Writing to HDFS should be done by creating a new file and writing data to it. Hadoop addresses a single writer multiple readers’ model. Once the data is written and file is closed, one cannot remove or alter data. Data can be added to the file by reopening the file and appending new data. +Delete. When a file is deleted by a user or from an application, the particular resource is not immediately removed from HDFS. The resource will be renamed and copied in to /trash directory giving the possibility to restore as long as it remains in the trash. +Mahasen’s main differentiation from above systems comes from its scalability. It can scale significantly than Nirvana Storage that depends on relational databases to scale the system, since the Mahasen metadata layer is natively distributed using a DHT.WSO2 Registry provides the clustering as the scalability option, but it is not optimized for large file transfers and storing as it uses an ATOM based resource transfers. Furthermore, Mahasen provides users a comprehensive metadata model for managing the distributed resources they stored with user-defined metadata, unlike the HDFS, which only focuses on creating a Distributed file system. Further Mahasen's metadata layer is natively distributed and fault tolerant while HDFS has a single name node which can make fault tolerant only with an active passive failover configuration. +3 High Level Architecture +3.1 Mahasen High Level Architecture +As shown by Figure 1, Mahasen consists of several storage nodes which are connected as peers to a logical ring via FreePastry. Each node consists of a registry to store +metadata and a file system to store physical file parts. Once connected to the ring each node contributes to the metadata space as well as file storage capacity, scaling the system dynamically with new node additions. Nodes use underline DHT (FreePastry) routing protocol to communicate efficiently with each other. +Fig. 1. Mahasen High Level Architecture +Mahasen uses a WSO2 registry and the file system in each node and DHT based architecture is used to connect the nodes to a one unit. +Mahasen has a distributed metadata layer that stores data about the distributed files in Mahasen peer to peer network. The metadata catalog is used to broker the stored resources in the network and to assist the user to locate the files in Mahasen distributed environment abstracting the metadata management from the user. +Mahasen stores two main types of metadata, which are system-defined metadata and user-defined (descriptive) metadata. System defined metadata is mainly used for server side resource handling. File name, file size, stored node IPs of file are examples of the system-defined metadata. User defined metadata is used to provide users the searching capability on those metadata. User can add tags and properties (name, value pairs) to the files that are uploaded. +Fig. 2. Metadata Object Structure of Mahasen +When a file is uploaded connecting to a Mahasen node the file will be temporarily saved in that node. Then the node will act as the master node and split the file into pre-defined sized chunks and the split parts are stored in a selected set of the neighborhood nodes of master node through parallel transfer. Then the metadata object created by master node will be stored with replicas using PAST storage implementation of Free pastry. We have rewritten PAST node’s persistent storage such that the data will be stored in the WSO registry in that node. +After storing the metadata, the nodes that received file parts act as worker nodes and replicate their file parts in parallel according to the replicate request issued by the master node. Each worker node will update the metadata object with stored locations of the file parts which were replicated after replicating their file parts using the capability of concurrent access to metadata objects, and Mahasen handles them using the locking system provided by the lock manager of DHT. +User can request to download a file from any Mahasen node and the node will first generate the resource ID for the requested and retrieve the metadata object. Then it extracts the locations of Mahasen nodes that contain the file parts from the metadata object and retrieve those parts to the local machine. The parts will be merged to create the original file after retrieving all the parts and the file will be streamed to the user. +Deletion can be performed with a single command across a heterogeneous storage system. When a delete request for a file is issued, by following the same method of retrieving the file, Mahasen finds nodes that store parts of the file and deletes them. Finally the metadata object will also be deleted with replicas +When user needs to update the user-defined metadata, the node that receives the update request retrieves the metadata object for the file from the DHT, updates it, and stores it back in the DHT. +. Using this model, Mahasen has built a complete decentralized metadata system that handles metadata management in a highly scalable and efficient manner. +Mahasen keeps replicas of both actual files and metadata objects. The main purpose of keeping replicas is for fault tolerance and failover recovery. We ensure the high availability of metadata while ensuring the scalability using free pastry’s underlying DHT. +3.2 Mahasen Search +When the amount of data in the system grows, the complexity of the search increases. Mahasen builds a distributed data structure using the underlying DHT, which can improve the performance of different search options that Mahasen supports. +The resources in Mahasen are associated with metadata and for each tag or property in system, we maintain an index pointing to all resources which have that tag or property. This is implemented as a TreeMap [16] and the property trees are stored in the DHT which handles replicas of it. +Fig. 3. A Property Tree Stored in Mahasen Memory Storage +When a user sends a search request, Mahasen extracts the requested search and initiate the execution of relevant search method. Then the resource IDs of the files which match with the given input are retrieved from the relevant property tree. Extracting the relevant resource IDs are done as follow. +Users can send search requests to any Mahasen node, and when a node receives a search request, Mahasen takes the property name given by the client and generates the property tree ID for that property. If the current node has the index for the property, it receives matching resource IDs for that property and sends them to the client. If not, the node acts as a master node and gets the node handles of the nodes which are having the specific property tree and routs Mahasen search messages with the required parameters to the node handles. Then those node handles will get the relevant resource IDs from the property trees in their memory storage and send back to the master node. +The property values in the property tree are sorted, so that if the search is a range based search, we can simply take the sub map between the initial and final property values and retrieve the set of resource IDs mapped to each of the node in the sub tree. Since these resource IDs represents the files having the given property values, Mahasen can look up for the metadata objects with those resource IDs and extract the file names to present to for the user. The operation of extracting the file names for the resource IDs has a high cost than extracting the matching resource IDs for the given search query. +Complete Data Structure built for Mahasen can support property based search, range based search, tag based search and Boolean operations for the properties such as AND operation and OR operation. The advanced search provided by Mahasen is capable of providing the search based on set of different properties and tags. +Mahasen Search utilizes the continuation model support by FreePastry in results retrieving and transferring. Therefore when a search request is issued, the application sends requests to look up node handles, which contain the particular TreeMap object to request results. Then the application will collect the first result incoming and resume action from the previous execution point. +3.3 File Handling +File Transfer. Mahasen is a network of storage nodes and users will be given a client which is the Mahasen Client to access and transfer files to the network. The Mahasen Client that is built using the Apache HttpClient [17] uses HTTP methods for transferring files to the network. First the client initiates a connection with one of the node in the network. An authenticated client is capable of uploading downloading, deleting, updating or searching for the files in the network. The File content will be added as an entity to the HTTP POST method and streamed to the target address. The receiving end will read the file stream and write it to the repository. +Replica Management. To achieve fault tolerance and failover recovery, the file will be split into a set of predefined chunks and each part will be replicated and stored in different nodes according to predefined replication factor. The placement of replicas is a critical part which affects the reliability and performance of the system. The purpose of having a policy for placement of replicas is for data reliability, availability, and network bandwidth utilization. The current policy of Mahasen is to store the replicated files in leaf nodes set to the initial node. The selection of nodes in the leaf set will be calculated using cost evaluation function which focus on the distance of the node. +After successfully transferring the file to the initial node, the client will be notified about the status of the file transfer and initial node will then replicate and transfer the file to other nodes. The number of copies kept for a file is called the replication factor of that file and will be decided by the Mahasen system. +File Splitting and Parallel transfer. Mahasen storage network is designed to store large files reliably across distributed nodes. When storing the file it will be split into blocks of fixed size and these blocks will be replicated across the network for fault tolerance. The transferring of replicated file blocks will be done in parallel to other nodes in order to utilize the bandwidth and to save time. +When focusing on the retrieval of a file by using the metadata object the system will then select a node which is closest to the reader node and download the blocks to the client. Downloading of file blocks will also be done in parallel and then the blocks will be merged to create the complete file. +3.4 Mahasen API +Mahasen provides a complete API to perform CRUD operations and search. Users can develop external clients apart from the default client Mahasen provides and integrate with existing systems to perform resource management and search operations. +3 Performance Analysis +The Mahasen System Scalability was tested by running a system with M nodes and N parallel clients. Here the value for M was 1, 6, 12, 18, 24 and N was 1, 5, 10, 15, 20. Each client carried out upload, download, delete and search operations for 10 times and the average was taken. The system configuration that was used in this test are, Two machines with Intel(R) Xeon(R) CPU E5-2403 1.80GHz 4 Core machines having 24GB RAM and One machine with Intel(R) Xeon(R) CPU E5-2470 2.30GHz 8 Core machines having 63GB RAM. Following Figures (from 4 to 7) depicts the results of this test. In the upload test, 500MB size files were used by each client. . +Fig. 4. Upload test results +In the results it is observed that when the number of client increases, the upload time is also increasing. We believe that this is due to the network congestion and background processes of data replication across nodes. When the number of nodes increased to 18 or 24, a reduction in upload time were observed. This was an expected behaviour, because the node which client selects to upload, distributes replica management task for other nodes in the p2p ring. +Fig. 5. Download test results +When download files using Mahasen client, it is observed that with the increase of number of client, the single node setup has a significant growth in the download time. In the performance test, a single node was chosen to send the client request while it coordinates the file transfer from other nodes in the setup. Therefore when there are multiple nodes in the system you can download file parts from other available nodes, which reduces the download time. +Fig. 6. Delete test results +When Mahasen performs a Delete on a resource, it involves 3 operations such as deleting metadata, deleting entries from search index, and deleting the physical file. When more nodes are in the system, each node can participate in deleting its own files in parallel, making the system more scalable and efficient. +Fig 7. Search test results +Search results illustrate that Mahasen can perform well even with more nodes added to the system. Usually single node should have the lowest possible time as it does not have to search across the p2p ring. But with multiple nodes, it has to aggregate results and present it to the client. This can be observed from the figure that, when more clients are in the system, results tend to converge into a lower value due to caching as we requested search operation through the same node. +3 Discussion and future work +Mahasen provides a highly scalable metadata structure with its peer-to-peer architecture in the metadata catalog. Unlike the existing metadata catalogs that use centralized architecture, Mahasen distributes metadata across the nodes in the system with the replication making the overall system scalable and fault tolerant. +Mahasen keeps replicas of both metadata objects and property trees as well. The DHT of FreePastry is used to store these objects in the system which provides easy access of them. Keeping replicas of metadata objects and property tree objects do not cost as much as keeping replicas of actual files which are very large in size compared to metadata and property tree objects. By having these objects with replicas in the system, Mahasen has been able to ensure the correct functioning of many of the Mahasen operations even in the conditions like node failures. +An important contribution of Mahasen is developing a distributed indexing structure on top of the DHT for searching data products using different properties associated with data products. Since Mahasen needed to support range based queries, we evaluated earlier effort to build such index structures. Skip Tree Graph [18] was one of the best candidates we selected for search assisting data structure, which can efficiently support range based queries over a DHT. Since we had different properties and data structure had to grow in two dimensions, one in number of properties and the other one in number of entries for one property we were forced to create different DHTs for different properties. Therefore we needed to evaluate a much less complex +solution since maintaining different DHTs could have been very expensive in terms of resources. +When the system scales up with the large number of nodes, it will be more costly to issue a search operation on the available raw metadata stored. Therefore Mahasen developed a combined data structure with DHT and TreeMap as explained earlier. +When a Mahasen node fails, and it is detected by the existing nodes in the network, Mahasen replicates all the metadata objects and the property tree objects which were in the failed node to the existing Mahasen node reading them from other replicas. Mahasen helps in preserving the availability of metadata objects and property tree objects by maintaining the replication factor of them a constant. +Current Mahasen design has several limitations, which we plan to handle as future works. Currently Mahasen stores each property indexes in one Mahasen node and assumes that it will fit within the memory of that node. This may not be major concern for simple cases, and even NoSQL storages like Cassandra makes similar assumptions. Dividing the property tree into parts and storing them in different nodes when it is larger than a given size can solve this problem. We can predefine the maximum size of a part that will be residing in one node. +Another challenge is that search based multiple properties where at least one is a common property would force Mahasen to join large data sets, and one potential solution is to negotiate the size of data sets before start the data merging. +To summarize, Mahasen project builds a scalable storage solution by making a group of existing open source registries work as a one unit. It provides a one logical global namespace, and users may talk to any node of the group and perform any operations. +Mahasen connects nodes (registries) using PAST, a storage overlay implemented on top of Pastry DHT algorithm. Furthermore, Mahasen builds a distributed indexing structure on top of DHT to support property-based search of data items. +A user can benefit from the Web Service API provided and effectively utilize for batch processing of file uploading task through a custom client or basic client provided by Mahasen. +References +1. Alexander, S., Szalay, Peter, Z., Kunszt, Ani Thakar, Jim Gray, Don Slutz, and Robert, J., Brunner.: Designing and Mining Multi-Terabyte Astronomy Archives.: The Sloan Digital Sky Survey. In: SIGMOD ’00 Proceedings of the 2000 ACM SIGMOD international conference on Management of data (2000) +2. Chaitanya Baru, Reagan Moore, Arcot Rajasekar, Michael Wan.:The SDSC Storage Resource Broker (1998) +3. Reagan, W., Moore.: Managing Large Distributed Data Sets using the Storage Resource Broker (2010) +4. G., DeCandia, D., Hastorun, and M., Jampani.: Dynamo.: Amazon’s Highly Available Key-value Store (2010) +5. Ghemawat, S.-T., Leun, and H., Gobioff.: The Google File System. +6. B., K., Nuno Santos.: Distributed Metadata with the AMGA Metadata Catalog. +7. Nirvana Storage - Home of the Storage Resource Broker (SRB®), http://www.nirvanastorage.com/index.php?module=htmlpages&func=display&pid=1 (2011) +8. XML Metadata Concept Catalog (XMC Cat), Data to Insight Center, Indiana University Pervasive Technology Institute, http://d2i.indiana.edu/xmccat. +9. Nirvana Performance, http://www.nirvanastorage.com/index.php?module=htmlpages&func=display&pid=54. +10. ApacheTM OODT, http://oodt.apache.org/ (2011) +11. WSO2 Governance Registry - lean.enterprise.middleware - open source SOA | WSO2, http://wso2.com/products/governance-registry/ (2011) +12. Apache Lucene - Overview, http://lucene.apache.org/java/docs/index.html. +13. HDFS Architecture Guide, http://hadoop.apache.org/docs/r1.0.4/hdfs_design.html (2011) +14. Pastry - A scalable, decentralized, self-organizing and fault-tolerant substrate for peer-to-peer applications, http://www.freepastry.org/. +15. P., Druschel and A., Rowstron.: PAST: A large-scale, persistent peer-to-peer storage utility. In: HotOS VIII, Schoss Elmau, Germany (2001) +16. TreeMap (Java 2 Platform SE 5.0), http://download.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html (2011) +17. HttpClient - HttpComponents HttpClient Overview, http://hc.apache.org/httpcomponents-client-ga/ (2011) +18. Alejandra Gonz´alez Beltr´an, Paul Sage and Peter Milligan.: Skip Tree Graph: a Distributed and Balanced Search Tree for Peer-to-Peer Networks. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Mahasen Distributed Storage Resource Broker.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..c23341e922bcd6d7d8c92f421ba720227f21896e GIT binary patch literal 89600 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide-relation.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide-relation.txt new file mode 100644 index 0000000..505897a --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide-relation.txt @@ -0,0 +1,204 @@ +最终由 nadeeshan gimhana修改于 五月 17 , 2019转至元数据起始&what&AGGREGATION +we&configuration&依赖 +brief overview&a typical user scenario a few more tool tips and tricks&依赖 +brief overview&a typical user scenario a few more tool tips and tricks&依赖 +brief overview&a typical user scenario a few more tool tips and tricks&依赖 +brief overview&FileManager The File Manager&依赖 +brief overview&FileManager The File Manager&依赖 +brief overview&FileManager The File Manager&依赖 +brief overview&filemgr-client and query-tool command&AGGREGATION +brief overview&FileManager The File Manager&依赖 +brief overview&a typical user scenario a few more tool tips and tricks&依赖 +brief overview&a typical user scenario a few more tool tips and tricks&依赖 +brief overview&FileManager The File Manager&依赖 +self&first time user&依赖 +you&page&依赖 +tutorial&mean&依赖 +tutorial&all file managers functionality&依赖 +complete overview&all file managers functionality&AGGREGATION +you&basic tool&依赖 +topic&page&依赖 +your&system& +/ filemgr/target/cas-filemgr&directory structure&依赖 +/ filemgr/target/cas-filemgr&directory structure&依赖 +/ filemgr/target/cas-filemgr&directory structure&依赖 +/ filemgr/target/cas-filemgr&directory structure&依赖 +/ filemgr/target/cas-filemgr&directory structure&依赖 +/ filemgr/target/cas-filemgr&directory structure&依赖 +you&version 0.3&依赖 +version 0.3&OODT&AGGREGATION +policy directory&directory&GENERALIZATION +you&OODT&依赖 +policy directory&this (&依赖 +policy directory&sub directory&依赖 +└ ─ ─ policy ├ ─ ─ elements.xml ├ ─ ─ product-type-element-map.xml └ ─ ─ product-types.xml&directory&依赖 +you&that&依赖 +brief description&directory&AGGREGATION +bin&configuration file&依赖 +bin&i.e. *&依赖 +bin&configuration file&依赖 +bin&i.e. *&依赖 +jar file log&contains file manager log file&依赖 +bin directory&number&依赖 +bin directory&directory&GENERALIZATION +number&executable&AGGREGATION +bin directory&executable&依赖 +You&file manager&依赖 +catalog query tool&File Manager&依赖 +/&filemgr&GENERALIZATION +you&java.net.BindException exception&依赖 +other service&port 9000&依赖 +file&filemgr process id&依赖 +you&configuration&依赖 +your&filemgr& +You&repository path&依赖 +You&product-types.xml file&依赖 +/&/&GENERALIZATION +path&repository path xml element&依赖 +your&xml& +it&filemgr.properties and product-type&依赖 +we&what&依赖 +your&catalog& +database&metada&AGGREGATION +place&metada&依赖 +place&metada&依赖 +place&database&依赖 +place&database&依赖 +your&files& +place&repository&依赖 +place&repository&依赖 +location&policy directory&AGGREGATION +your&directory& +your mime-types configuration file&file recognition&依赖 +your mime-types configuration file&file recognition&依赖 +your mime-types configuration file&file recognition&依赖 +your mime-types configuration file&your mime-types configuration file&依赖 +your mime-types configuration file&your mime-types configuration file&依赖 +your mime-types configuration file&your mime-types configuration file&依赖 +Your&mime-types& +your mime-types configuration file&file recognition&依赖 +your mime-types configuration file&your mime-types configuration file&依赖 +metada&brief note&依赖 +metada&how&依赖 +filemgr&metada&依赖 +filemgr&client side metada extraction and server side metada extraction&依赖 +filemgr&two different way&依赖 +metadata file&file&GENERALIZATION +Client side metada&filemgr&依赖 +Client side metada&xml formatted metadata file&依赖 +a file call blah.txt&metadata file&依赖 +extractor&chosen policy directory&依赖 +extractor&product-types.xml file&依赖 +you&/ usr/local/oodt / cas-filemgr/policy&依赖 +you&example configuration&依赖 +you&have&依赖 +you&policy directory&依赖 +you&policy directory&依赖 +you&/ usr/local/oodt / cas-filemgr/policy&依赖 +version 0.3 or earlier&OODT&AGGREGATION +you&policy directory&依赖 +example configuration&configuration&GENERALIZATION +you&version 0.3 or earlier&依赖 +you&cas-filemgr/policy/oodt&依赖 +product-types.xml file&file&GENERALIZATION +we&repository&依赖 +our&file& +It&critical information&依赖 +we&first file&依赖 +It&going&依赖 +we&that&依赖 +GenericFile type& key&依赖 +It&metada&依赖 +We&product type&依赖 +GenericFile type& key&依赖 +It&extractor&依赖 +more detail&Metadata Extractors&依赖 +more detail&Metadata Extractors&依赖 +we&product types and element&依赖 +reader&discussion&依赖 +discussion&best practice&AGGREGATION +reader&Everything&依赖 +you&File Manager Policy&依赖 +reader&w.r.t File Manager Policy&依赖 +reader&best practice&依赖 +command&/ usr/local/oodt / cas-filemgr/bin&依赖 +brief overview&filemgr-client and query-tool&AGGREGATION +we&filemgr-client&依赖 +number&different way&AGGREGATION +location&filemgr xml-rpc data transfer interface&AGGREGATION +INFO statement&us&依赖 +we&that&依赖 +13 different type&operation&AGGREGATION +we&-- ingestProduct operation&依赖 +you&further command line argument&依赖 +I&light&依赖 +we&ingestProduct&依赖 +your&repository& +content&repository&AGGREGATION +/ query-tool Must&a query and filemgr url&依赖 +anything&query tool&AGGREGATION +SELECT&GenericFile& +query&SELECT& +it&us&依赖 +you&look&依赖 +a typical user scenario time&simple file&实现 +a typical user scenario time&a typical user scenario time&依赖 +a typical user scenario time&a typical user scenario time&实现 +a typical user scenario time&simple file&依赖 +it&$ cd / usr/local/oodt / cas-filemgr/bin $&依赖 +it&filemgr.properties&依赖 +we&client side metada&依赖 +metadata collection&product-types.xml file&依赖 +metadata collection&specified * Extractor extractor&依赖 +metadata collection&server side&依赖 +its&file& +tmp/blah&text file&依赖 +tmp/blah&text file&依赖 +tmp/blah&ingestion&依赖 +text file&file&GENERALIZATION +hello&tmp/blah& +tmp/blah&ingestion&依赖 +blah.txt.met let&file&依赖 +we&arguments :&依赖 +you&ingested product&依赖 +your&product& +we&product location&依赖 +we&whole directory&依赖 +we&one product&依赖 +/&tmp/blah&GENERALIZATION +output&sep 16 , 2011 2:09:42 pm org.apache.oodt.cas.filemgr.system.xmlrpcfilemanagerclient &依赖 +You&your first file (&依赖 +your&file& +we&metada&依赖 +Query&/&依赖 +output&sep 16 , 2011 2:21:54 pm org.apache.oodt.cas.filemgr.system.xmlrpcfilemanager complexquery info&依赖 +output&sep 16 , 2011 2:21:54 pm org.apache.oodt.cas.filemgr.system.xmlrpcfilemanager complexquery info&依赖 +file&archive&依赖 +Query command&catalog implementation&依赖 +-- sql and -- lucene&filemgr query syntax&依赖 +query&tutorial&依赖 +query&time&依赖 +query&tutorial&依赖 +query&time&依赖 +small deviation&unexpected value&依赖 +small deviation&exception&依赖 +Formatting&query&AGGREGATION +small deviation&query return&依赖 +small deviation&unexpected value&依赖 +small deviation&exception&依赖 +small deviation&query return&依赖 +single quote ('')&Count&依赖 +single quote ('')&WHERE clause&依赖 +single quote ('')&command line option&依赖 +=&Count& +single quote ('')&string value&依赖 +order&return value&AGGREGATION +you&\ outputFormat option&依赖 +verbose example&aware&依赖 +verbose example&SQL-like syntax&依赖 +CAS.ProductReceivedTime&\& +=&blah.txt& +sortBy&\& +WHERE&blah.txt& +a few more tool cameron goodale&some useful command line tool alias&依赖 +My&Catalog& diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt new file mode 100644 index 0000000..d54f7dd --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt @@ -0,0 +1,299 @@ +OODT Filemgr User Guide +页面… CAS User Guides +跳到banner的尾部 +回到标题开始 +转至元数据结尾 +由 Thomas Bennett创建, 最终由 Nadeeshan Gimhana修改于 五月 17, 2019转至元数据起始 +The File Manager +An Overview of What is Installed +Configuring and Running the File Manager +Whats going to happen? +Now for some configuration +What have we configured? +How metadata is collected? +A brief overview of filemgr-client and query-tool +Command: filemgr-client +Command: query-tool +A Typical User Scenario +A few more tools +Tips and Tricks for FileManager +The File Manager +This self guided tutorial is intended for first time users. + +The fact that you've found this page, I assume that you are seriously thinking of using the OODT File Manager but are eager to get something up and running. It hopefully also means that you've checked out the code and built a cas-filemgr install target (e.g. a cas-filemgr-${version}-dist.tar.gz file). + +This tutorial is by no means a complete overview of all the File Managers functionality. However, it's an attempt to get you started using the basic tools. Like learning to drive a car, the most difficult part is getting it started and on the road! + +The following topics are covered on this page: + +An Overview of What is Installed +Configuring and Running the File Manager +A Typical User Scenario - ingesting and querying +An Overview of What is Installed +Assumption - you have built or have access to a cas-filemgr install target. This also means that you've correctly configured maven and java for your system. + +Here are the commands to install the cas-filemgr target from a tarfile. You will need to fit in the "..." with the appropriate content. + +$ mkdir -p /usr/local/oodt/ +$ tar xzvf .../filemgr/target/cas-filemgr-${version}-dist.tar.gz -C /usr/local/oodt/ +$ cd /usr/local/oodt/ +$ ln -s cas-filemgr-${version}/ cas-filemgr +The decompressed tar file creates a directory structure that looks as follows: + +. +├── bin +│ ├── filemgr +│ ├── filemgr-client +│ └── query-tool +├── etc +│ ├── filemgr.properties +│ └── mime-types.xml +├── lib +│ └── *.jar +├── logs +└── policy +| ├── cmd-line-actions.xml +| ├── cmd-line-options.xml +| ├── core +| │ ├── elements.xml +| │ ├── product-type-element-map.xml +| │ └── product-types.xml +| | +| ├── trace +| | ├── elements.xml +| | ├── product-type-element-map.xml +| | └── product-types.xml +| | +| ├── geo +| | ├── elements.xml +| | ├── product-type-element-map.xml +| | └── product-types.xml +| | +| (additional policy sub directories) +└── run +Please note, if you are using version 0.3 of OODT or earlier, the policy directory will look like this (with no sub directories): + +└── policy + ├── elements.xml + ├── product-type-element-map.xml + └── product-types.xml +Here is a brief description of each directory that you see listed: + +bin : contains shell convenience scripts for launching java classes +etc : contains configuration files, i.e. *.property and *.xml files +lib : contains java resources, i.e *.jar files +logs : contains file manager log files. +policy : contains product specifications, i.e *.xml specification files +The bin directory contains a number of executables: + +filemgr : file manager (startup/shutdown) script +filemgr-client : file manager client interface script +query-tool : catalog query tool +Configuring and Running the File Manager +You're now ready to run the file manager! + +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./filemgr --help +Usage: ./filemgr {start|stop|status} +$ ./filemgr start +Whats going to happen? +The filemgr should be up and running, however, some WARNING messages may appear, complaining about configuration. + +If you get a java.net.BindException exception, make sure that no other service is running on port 9000. This is the port for an RPC interface that will be used for transferring data files into a repository. + +There's also a new file in the /usr/local/oodt/run directory. The file contains the filemgr process id. This is typical for *nix service house keeping. It is done to try and avoid running multiple filemgr services. + +There's also a new log file /usr/local/oodt/cas-filemgr/logs/cas_filemgr0.log. Tailing this file can often alert to you problems. + +$ tail -f /usr/local/oodt/cas-filemgr/logs/cas_filemgr0.log + +Now for some configuration +To do anything useful with your filemgr, you will need to specify some configurations in the /usr/local/oodt/cas-filemgr/etc/filemgr.properties file. + +Here is a basic modification to the filemgr.properties file: + +filemgr.properties +org.apache.oodt.cas.filemgr.catalog.lucene.idxPath=/usr/local/oodt/cas-filemgr/catalog +org.apache.oodt.cas.filemgr.repositorymgr.dirs=file:///usr/local/oodt/cas-filemgr/policy/core +org.apache.oodt.cas.filemgr.validation.dirs=file:///usr/local/oodt/cas-filemgr/policy/core +org.apache.oodt.cas.filemgr.mime.type.repository=/usr/local/oodt/cas-filemgr/etc/mime-types.xml +You will also need to specify a repository path in the product-types.xml file. Make sure that this path exists before you change the repository path xml element. + +product-types.xml + +Restart your filemgr so that it re-reads the filemgr.properties and product-types.xml: +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./filemgr restart + +What have we configured? +A place to store your catalog, i.e. the database of metadata. +A place to store your ingested files, i.e. the repository. +The location of your policy directory for product specifications. +Your mime-types configuration file for file recognition. +How metadata is collected? +Now for some brief notes about how metadata is collected. The filemgr captures metadata in two different ways - from client side metadata extraction and server side metadata extraction. + +Client side metadata is passed to the filemgr via an xml formatted metadata file. E.g. a file called blah.txt can have a metadata file called blah.txt.met. This met file can be created in many ways, even by hand! And thats exactly what we're going to do. + +Server side metadata is generated by using java classes and the extractors that will be used are configured in the product-types.xml file in the chosen policy directory. For this example configuration, you should have /usr/local/oodt/cas-filemgr/policy/oodt as the policy directory, unless you're running version 0.3 or earlier of OODT, in which case you should have /usr/local/oodt/cas-filemgr/policy as the policy directory. + +Now would be a good time to have a quick look at the product-types.xml file. It contains some critical information about what is going to happen when we ingest our first file into the repository. + +Specified in the product-types.xml file, there is a default product type called GenericFile. This is the product type that we are going to use for the first file for ingestion. + +For the GenericFile type find the key. It's specifying some metadata. We're defining the product type! + +For the GenericFile type find the key. It's specifying some extractors to use for server side metadata extraction, namely: CoreMetExtractor, MimeTypeExtractor, FinalFileLocationExtractor. For more details about metadata and extractors see Metadata Extractors. + +If you're feeling curious, check out the other xml files in the /usr/local/oodt/cas-filemgr/policy subdirectories to get a better feel for how we define product types and elements. For a discussion of best practices w.r.t File Manager Policy, the reader is referred to Everything you want to know about File Manager Policy + +A brief overview of filemgr-client and query-tool +These commands are found in /usr/local/oodt/cas-filemgr/bin. + +Command: filemgr-client +In order to trigger a file ingestion we're going to use the filemgr-client. This is by no means the most automated way to ingest data into an repository, however it's a really easy and intuitive way to trigger a file ingestion. The filemgr-client is a wrapper script, making it easier to invoke a java executable from the command line. + +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./filemgr-client --help +filemgr-client --url --operation [ [params]] +operations: +--addProductType --typeName --typeDesc + --repository --versionClass +--ingestProduct --productName --productStructure + --productTypeName --metadataFile + [--clientTransfer --dataTransfer ] + --refs ... +--hasProduct --productName +--getProductTypeByName --productTypeName +--getNumProducts --productTypeName +--getFirstPage --productTypeName +--getNextPage --productTypeName --currentPageNum +--getPrevPage --productTypeName --currentPageNum +--getLastPage --productTypeName +--getCurrentTransfer +--getCurrentTransfers +--getProductPctTransferred --productId --productTypeName +--getFilePctTransferred --origRef +As you can see there's a number of different ways this command can be executed. + +The first command line argument is --url. This is the location of the filemgr xml-rpc data transfer interface. Looking at the filemgr logs (specifically cas_filemgr0.log), we see an INFO statement telling us that local data transfer is enable on http://localhost:9000. This is the url that we need to specify. + +The second command line argument is --operation and there are 13 different types of operations that are possible! For now we are going to use the --ingestProduct operation. From the help command you can see that the --ingestProduct operation requires some further command line arguments to be specified. + +However, before we take a look at the --operation --ingestProduct, I would first like to shed a bit more light on the query-tool command. + +Command: query-tool +This is a very useful wrapper script to query the content of your repository. + +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./query-tool +Must specify a query and filemgr url! +Usage: QueryTool [options] +options: +--url + Lucene like query options: + --lucene + -query + SQL like query options: + --sql + -query + -sortBy + -outputFormat +We see that we need to set some command line arguments to get anything useful out of the query tool. Try the next command: + +$ ./query-tool --url http://localhost:9000 --sql -query 'SELECT * FROM GenericFile' + +This should throw an exception, telling us it failed to perform a query. This is because there is no catalog yet (and therefore the GenericFile information does not exist). In fact if you have a look there is no catalog directory: + +$ ls /usr/local/oodt/cas-filemgr/catalog +ls: /usr/local/oodt/cas-filemgr/catalog: No such file or directory + +A Typical User Scenario +Time to ingest a very, very simple file. If you have not already, restart your filemgr so that it re-reads the filemgr.properties: +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./filemgr restart + +For this simple ingestion we are not going to include any client side metadata, all the metadata collection will happen on the server side using the specified *Extractor extractors in the product-types.xml file. + +Create a text file and its metadata file for ingestion: +$ echo 'hello' > /tmp/blah.txt +$ touch /tmp/blah.txt.met + +Add the following xml to the /tmp/blah.txt.met file: + +blah.txt.met + + +Lets ingest the file! For --operation --ingestProduct we need to specify the following arguments: + +--productName : The name you want for your ingested product +--productStructure : Flat file or directory (i.e. hierarchical). Yes... we can ingest whole directories as one product +--productTypeName : A product type (as per product-types.xml) +--metadataFile : The client side metadata file +--refs : The product location +There's also an optional argument --clientTransfer, however, we're going to leave this and use the default local transfer. +[--clientTransfer --dataTransfer ] + +Here is the complete command: +$ ./filemgr-client --url http://localhost:9000 --operation --ingestProduct --productName blah.txt --productStructure Flat --productTypeName GenericFile --metadataFile file:///tmp/blah.txt.met --refs file:///tmp/blah.txt + +The output should look like: +Sep 16, 2011 2:09:42 PM org.apache.oodt.cas.filemgr.system.XmlRpcFileManagerClient +... +... +ingestProduct: Result: c2fbf4b9-e05c-11e0-9022-77a707615e7f + +You've just archived your first file (眨眼). + +To complete the process, lets see if we can retrieve the metadata. Run the query command again: +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./query-tool --url http://localhost:9000 --sql -query 'SELECT * FROM GenericFile' + +The output should look like: +Sep 16, 2011 2:21:54 PM org.apache.oodt.cas.filemgr.system.XmlRpcFileManager complexQuery +INFO: Query returned 1 results +/var/archive/data/blah.txt,GenericFile,blah.txt,blah.txt,2011-09-16T14:09:43.405+02:00,c2fbf4b9-e05c-11e0-9022-77a707615e7f,Flat,text/plain,text,plain + +Check to see if the file has appeared in the archive: +$ ls /var/archive/data/blah.txt/ +blah.txt + +Query commands do not depend on the underlying catalog implementation. The --sql and --lucene instead describe the filemgr query syntax. + +At the time of writing this tutorial, composing queries using query-tool is not entirely straight forward, but entirely usable. Formatting of these queries is critical, small deviations from the syntax can result in the query return an unexpected value or throwing an exception. + +Some things to note about SQL queries: + +Use double quotes ("") for when specifying the SQL syntax. The single quote ('') is used for string values in a WHERE clause, e.g WHERE Filename='blah.txt' +Count the number of -- before each command line option. Some are -- and others are -. +The order of the return values for a search is not guaranteed unless you specify the \outputFormat option. +Here is a somewhat verbose example that uses all the SQL-like syntax that I am currently aware of (apologies for all the line breaks). + +$ cd /usr/local/oodt/cas-filemgr/bin +$ ./query-tool --url http://localhost:9000 --sql \ +-query "SELECT CAS.ProductReceivedTime,CAS.ProductName,CAS.ProductId,ProductType,\ +ProductStructure,Filename,FileLocation,MimeType \ +FROM GenericFile WHERE Filename='blah.txt'" -sortBy 'CAS.ProductReceivedTime' \ +-outputFormat '$CAS.ProductReceivedTime,$CAS.ProductName,$CAS.ProductId,$ProductType,\ +$ProductStructure,$Filename,$FileLocation,$MimeType' +The output should look like: +2011-10-07T10:59:12.031+02:00,blah.txt,a00616c6-f0c2-11e0-baf4-65c684787732, +GenericFile,Flat,blah.txt,/var/kat/archive/data/blah.txt,text/plain + +Now you can also check out some of the other 12 --operation possibilities for filemgr-client. For instance: + +$ ./filemgr-client --url http://localhost:9000 --operation --hasProduct --productName blah.txt + +Or: + +$ ./filemgr-client --url http://localhost:9000 --operation --getFirstPage --productTypeName GenericFile + +A few more tools +Cameron Goodale has written some useful command line tools aliases that are worth mentioning before we continue. See the following two web pages: https://issues.apache.org/jira/browse/OODT-306 +BASH and TCSH shell tools for File Manager + +Tips and Tricks for FileManager +Q: My Lucene Index Catalog is running slow now that I have over 100,000 products cataloged. How can I get the speed back? + +A: Run this command: +java -Djava.endorsed.dirs= org.apache.oodt.cas.filemgr.tools.OptimizeLuceneCatalog --catalogPath \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/OODT Filemgr User Guide.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..ff0881c3ee525ca8c15dd4d5aad253cf6dbbfafa GIT binary patch literal 31232 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 WPJIu$e0>F<{{I~LN9hk?1pXPdy#vSq literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action-relation.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action-relation.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt new file mode 100644 index 0000000..1c22f33 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt @@ -0,0 +1,26 @@ +Catalog and Archive File Management Component 0.12 API +Packages +Package Description +org.apache.oodt.cas.filemgr.catalog +org.apache.oodt.cas.filemgr.catalog.solr +org.apache.oodt.cas.filemgr.cli.action +org.apache.oodt.cas.filemgr.datatransfer +org.apache.oodt.cas.filemgr.exceptions +org.apache.oodt.cas.filemgr.ingest +org.apache.oodt.cas.filemgr.metadata +org.apache.oodt.cas.filemgr.metadata.extractors +org.apache.oodt.cas.filemgr.metadata.extractors.examples +org.apache.oodt.cas.filemgr.repository +org.apache.oodt.cas.filemgr.structs +org.apache.oodt.cas.filemgr.structs.exceptions +org.apache.oodt.cas.filemgr.structs.query +org.apache.oodt.cas.filemgr.structs.query.conv +org.apache.oodt.cas.filemgr.structs.query.filter +org.apache.oodt.cas.filemgr.structs.type +org.apache.oodt.cas.filemgr.structs.type.examples +org.apache.oodt.cas.filemgr.system +org.apache.oodt.cas.filemgr.system.auth +org.apache.oodt.cas.filemgr.tools +org.apache.oodt.cas.filemgr.util +org.apache.oodt.cas.filemgr.validation +org.apache.oodt.cas.filemgr.versioning \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/Package org.apache.oodt.cas.filemgr.cli.action.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..f8af3037fb4043ef401be08ca2007838c77a1e74 GIT binary patch literal 4096 zcmeHKOHWf#5T1Lvr68~J5EMn50+E)gU^FojEGR5oXbfO90aHu45rj}I7ZWyG6?dAL zxOKzQjgO5kG)8tVNHn@IaRvSZ6HQzI*Kg+B3oWm(Fg}pe%sF?ynRDj6X6E$$yW*M2 zXO*+GtTa&;E!eq~orY^^-{d3G!85jC+ct~%8=qU{AKHNqO5kUapW0~{ZIZ_MC^uZn z$)mZ;&A1=yjF1Ic%BvL4!+MeisaNJPxK6LtMJ1#!+UI$!uC)^FcI>Z|{9g$B?mUQF z155XS*yowwDw}@?*k?J8vrndOL1ln2TO6@UssMIfXADh8E+Nf6u+j&A};Vd+4KY+S`h=Vc(y{jd*HI$-VdjzK2Hm9>mQd zYal+_cg6o3$_bf6Oyj%REcHVmg}6_QAnKzomHLTDUnxyU`n5u>=h*A&qtM_t$pyVd z^zKO=kh&1HMlYn#XF(cqbKgSWzH#44V;*Wv4#b9jpV!Dc-yzEM@%7KQAF~DM&S~#wMxlZOtO7RGVsDUWT210&! zMh;sie6Y!31N#G*PqeNj3JYNh(mw8(-Yeu^>Jsv2=r>cCa2)A|)XXz%@ubqsMIuWE z4^urIOf%^Ac5OOc#q3hQ8Hq?l-)(HiVtM0doDW&>Z?0f{obTIe`fK4l>T3F%8Q1vQ zEf#k_>(xH|a0Mb64OGbc1}UESuZnRJODwDMQ-Qlvi3xk+fwgk9|qv zz#T-FX@35|3p@Kw(`vYjjHu!FSd-SMfMYqqf#&GCMO6w;W< z9zvQvldw!1c{zvLFk{ZkoTF7N_tDFOY44Pp7v<@kl~r-)UW4RbAQ3Phbsus$N5f)? zgFcKo_vq_~)4gXSQNcrk*Gqj%kd&-kjaiF5M%1L6kW3lw3*feBPe?sU0gT=U;-5}o zE$mEWCZfieiD+~V66~eUZwvKLQoTQNbbe*&依赖 +Run bower&save&依赖 +flag add&dependency&依赖 +partition and disk&React debugging tool&依赖 +partition and disk&Chrome Developer Tools&依赖 +FileBrowser dialog&object previewer/property manager&依赖 +FileBrowser dialog&FileBrowser object&依赖 +them&individual contributor role&依赖 +them&manager role&依赖 +json&JSON&依赖 +It&collaboration&依赖 +It&my development task and time&依赖 +It&me&依赖 +template and NOT&final purchase file&AGGREGATION +part&template and NOT&AGGREGATION +They&template and NOT&依赖 +file&above import&依赖 +right click Libraries Add&Go&依赖 +project&Go& +your&project& +an html5 drag & drop file uploader&an html5 drag & drop file uploader&依赖 +I&somebody&依赖 +you&‘ public_html ’ folder&依赖 +you&domain&依赖 +you&file manager&依赖 +Your&first& +build script ( dev-build&build script ( dev-build&依赖 +Manager&icons& +) wrap long file name&Folder Tree&依赖 +) wrap long file name&icon&依赖 +) wrap long file name&) wrap long file name&依赖 +com&working&依赖 +com&you&依赖 +com&opportunity&依赖 +You&flexible ReactJS component&依赖 +create-react-app&files [ 0 ] ) }&依赖 +create-react-app&browser&依赖 +list&top react native developer&AGGREGATION +I&File Manager&依赖 +I&file&依赖 +popular open-source JavaScript library&you&AGGREGATION +project&build&依赖 +part&project&AGGREGATION +project&part&依赖 +project&restore&依赖 +json file&Build ”&依赖 +json file&“ Enable Restore&依赖 +json file&Build ”&依赖 +json file&“ Enable Restore&依赖 +lot&people&AGGREGATION +file&module-name&依赖 +upload react website&“&AGGREGATION +subdomain open file manager&new folder&依赖 +upload react website&” folder&依赖 +I&Kendo UI File Manager&依赖 +I&custom command&依赖 +Restore&client-side library&依赖 +Restore&libman&依赖 +Restore&libman&依赖 +Restore&client-side library&依赖 +user&own directory&依赖 +It&multiple user&依赖 +creation&multiple user&AGGREGATION +It&creation&依赖 +its&directory& +we&task manager application&依赖 +it&previewer&依赖 +DevExtreme JavaScript FileManager component&you&依赖 +DevExtreme JavaScript FileManager component&files and directory&依赖 +I&addition&依赖 +I&React JSX file&依赖 +corresponding online repository&package&AGGREGATION +time&top&依赖 +time&GCS cloud storage bucket&依赖 +top&GCS cloud storage bucket&AGGREGATION +time&Dropbox-like functionality&依赖 +time&Dropbox-like functionality&依赖 +time&GCS cloud storage bucket&依赖 +time&top&依赖 +you&standard file input HTML element&依赖 +Binding&UI element&AGGREGATION +React&modern web application&依赖 +one&best choice&AGGREGATION +React&best choice&依赖 +React&slim apus&依赖 +installation file&it&AGGREGATION +KendoReact Upload component&KendoReact library&依赖 +KendoReact library&React UI component&AGGREGATION +KendoReact Upload component&React UI component&依赖 +part&KendoReact library&AGGREGATION +your&analytics& +you&analytic&依赖 +React component&component&GENERALIZATION +new React component&JavaScript and TypeScript&依赖 +file caching system&two main part&依赖 +Our&system& +tailor fman&powerful plugin system&依赖 +tailor fman&powerful plugin system&依赖 +its&system& +tailor fman&powerful plugin system&依赖 +tailor fman&powerful plugin system&依赖 +tailor fman&powerful plugin system&依赖 +tailor fman&powerful plugin system&依赖 +tailor fman&powerful plugin system&依赖 +tailor fman&powerful plugin system&依赖 +React&single button&依赖 +app&interface& +React&few piece&依赖 +React&interface&依赖 +few piece&interface&AGGREGATION +requirement&File Upload Component&依赖 +requirement&React&依赖 +file manager&local computer&依赖 +npm&save&依赖 +React&web&依赖 +React&frontend library&依赖 +your&computer& +npm&react-file&依赖 +reacto&x86/x64 personal computer&依赖 +npm start&build&依赖 +npm start&a new&依赖 +system service&long-running download&依赖 +system service&handling&依赖 +system service&long-running download&依赖 +system service&handling&依赖 +handling&long-running download&AGGREGATION +RNFetchBlob&functionality& +method&you&依赖 +method&Windows Explorer&依赖 +its&features& +list&key feature&AGGREGATION +md file store transaction&md file store transaction&依赖 +second be&Redux store&依赖 +set&actions and reducer&AGGREGATION +second be&Redux store&依赖 +second be&actions and reducer&依赖 +Webix widgets and application&Angular or React environment&依赖 +integrate tinymce editor&Laravel&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&Laravel&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&Laravel&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&Laravel&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +integrate tinymce editor&image upload jquery php july 27 , 2019 2,006 view&依赖 +image upload jquery php july 27 , 2019 2,006 view&Sortable&依赖 +integrate tinymce editor&Laravel&依赖 +integrate tinymce editor&Laravel&依赖 +we&animation&依赖 +we&File Manager App uus&依赖 +we&React Native&依赖 +You&high end protection&依赖 +It&file manager&依赖 +you&React&依赖 +you&reusable component&依赖 +table&file manager&依赖 +table&default texts and message&依赖 +table&en culture&依赖 +default texts and message&file manager&AGGREGATION +en culture&culture&GENERALIZATION +modern toolchain&React developer&AGGREGATION +this project base course&this project base course&依赖 +user&image and video and etc and Instagram&依赖 +user&example&依赖 +repo&page& +your&repo& +your&repository& +benefit&React&AGGREGATION +folder&creation&GENERALIZATION +full list&compatible frameworks and integration example&AGGREGATION +Files and folder&npm install&依赖 +part&default react-native init installation&AGGREGATION +other file & folder and some truncate )&default react-native init installation&依赖 +our&focus& +other file & folder and some truncate )&default react-native init installation&依赖 +you&other file&依赖 +Accessible&Keyboard&依赖 +Accessible&Keyboard&依赖 +own React&Browserify&依赖 +own React&process (&依赖 +npm&package manager&依赖 +npm&Node&依赖 +multiple package&package&依赖 +Bower&jQuery&依赖 +multiple package&example&依赖 +You&two option&依赖 +You&file uploader&依赖 +reacto&computer&依赖 +your&tools& +free , opensource reimplementation&windows relate&AGGREGATION +Paper Kit reacto&windows relate&实现 +Developer Express Inc&warranty&依赖 +warranty&merchantability and fitness&AGGREGATION +Developer Express Inc&warranty&依赖 +Removed complementary design file&[ 5&依赖 +tagspace feature basic file management operation&tagspace feature basic file management operation&依赖 +it&simple file manager&依赖 +dhtmlxGrid&rich API functionality&依赖 +unparalleled array&feature&AGGREGATION +Asus file manager&file manager&GENERALIZATION +part&dhtmlxSuite library&AGGREGATION +world&grid& +last post 2 hour&last post 2 hour&依赖 +net core&RSS 0&依赖 +last post 2 hour&last post 2 hour&依赖 +last post 2 hour&fiazahmed an electron base file manager&依赖 +net core&RSS 0&依赖 +net core&RSS 0&依赖 +last post 2 hour&fiazahmed an electron base file manager&依赖 +It&visual file manager&依赖 +it&function&依赖 +your&app& +set&function&AGGREGATION +it&set&依赖 +presence&drag & drop responsiveness&依赖 +presence&handler&AGGREGATION +newer version&program use&AGGREGATION +FileManager&file system provider&依赖 +you&opinion&依赖 +you&folder&依赖 +fastlane&folder&依赖 +you&file&依赖 +you&file&依赖 +Firebase issue&issue&GENERALIZATION +Firebase issue&[ 5&依赖 +Firebase issue&[ 5&依赖 +create-react-app utility&tool&依赖 +create-react-app utility&Babel and webpack&依赖 +create-react-app utility&Babel and webpack&依赖 +create-react-app utility&tool&依赖 +we&Client React component&依赖 +Client React component&React component&GENERALIZATION +our&library& +our&detail& +nyc_output and coverage folder&instrumentation detail&依赖 +React admin dashboard&frontend framework&依赖 +React admin dashboard&material-uus&依赖 +term&frontend framework&AGGREGATION +React admin dashboard&term&依赖 +It&accessing&依赖 +It&user&依赖 +It&common file operation&依赖 +sample&Android 4 ICS emulator image&依赖 +smartphone&file manager&依赖 +smartphone&view&依赖 +npm package&call package&依赖 +npm package&file&依赖 +you&number&依赖 +see bundler default&full list&依赖 +see bundler default&full list&依赖 +Bower&front-end&依赖 +It&file&依赖 +Cezerin&open-source ecommerce platform&依赖 +your&component& +you&Social Sites&依赖 +your&site& +9 all file upload&a json response (&依赖 +9 all file upload&a json response (&依赖 +curriculum&introspection&依赖 +curriculum&building skill&依赖 +curriculum&addition&依赖 +Plugin&Front-end & Back-end&依赖 +Plugin&two part&依赖 +re-run&package manager&AGGREGATION +your&changes& +user&upload button&依赖 +this package help&file and assest&依赖 +this package help&you&依赖 +your&service& +you&large files/streaming&依赖 +you&Android Download Manager&依赖 +help&Suite component&AGGREGATION +React component&yarn or npm&依赖 +you&yourself&依赖 +you&few step&依赖 +app&file& +class App&App&GENERALIZATION +class App&React&依赖 +use npm&Expo CLI command line utility&依赖 +you&package&依赖 +html file&code coverage&依赖 +html file&code coverage&依赖 +our&coverage& +bootstrap npm&axio&依赖 +react-toastify&beautiful notification&依赖 +We&react project react-file-upload – cd react-file-upload&依赖 +bootstrap npm&npm&GENERALIZATION +bootstrap help&uus&依赖 +CKEditor 4&external file manager and ( file browser/uploader&依赖 +CKEditor 4&( file browser/uploader&依赖 +smart filemanager&Material Design style&依赖 +smart filemanager&Jonas Sciangula Street&依赖 +smart filemanager&Material Design style&依赖 +smart filemanager&Material Design style&依赖 +smart filemanager&angularj&依赖 +smart filemanager&Jonas Sciangula Street&依赖 +smart filemanager&angularj&依赖 +smart filemanager&Jonas Sciangula Street&依赖 +smart filemanager&angularj&依赖 +page ( module instance&page )&依赖 +file&page )&依赖 +file&page&依赖 +file&individual rendered module&依赖 +instance&module&AGGREGATION +your&server& +website&page& +your&website& +You&custom thumbnail and text description&依赖 +You&file or folder&依赖 +Drag and Drop Support&files or folder&依赖 +React FileManager component 23 Feb 2021 / 1 minute&file manager&依赖 +your&program& +you&it&依赖 +your&Panel& +you&folder&依赖 +Panel&manager& +file&actual file&依赖 +its&details& +file&actual file&依赖 +rest¬hing ( white page )&依赖 +rest&website&AGGREGATION +React File Manger Multi-column File Manager&react-beautiful-dnd&依赖 +js developers one&js developers one&依赖 +React and TypeScript&development&实现 +development&visual interface&AGGREGATION +React and TypeScript&visual interface&实现 +/ /&path / / Specify&依赖 +/ /&it&依赖 +/ /&/&GENERALIZATION +Specify&defaultUser& +your&defaultUser& +your&Specify& +software management automation&installer&依赖 +Chocolatey&Windows&依赖 +Files file&cloud service&依赖 +Files file&server&依赖 +a flexible and beautiful select input control&reactj&依赖 +a flexible and beautiful select input control&reactj&依赖 +a flexible and beautiful select input control&reactj&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&reactj&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +a flexible and beautiful select input control&multiselect , autocomplete and ajax support&依赖 +assetExts resolver option&package&AGGREGATION +Metro Bower keeps track&package&AGGREGATION +You&other type&依赖 +your&track& +You&support&依赖 +its&content& +please note&folder&依赖 +you&file&依赖 +you&blank file&依赖 +their&systems& +KendoReact Upload&file system&依赖 +KendoReact Upload&file&依赖 +Template&require syntax&依赖 +uploaded file&Java SDK • fix&依赖 +their&checker& +uploaded file&http status 404-not found "&依赖 +uploaded file&upload image&依赖 +uploaded file&java sdk • fixed unable&依赖 +kendo ui r1&kendo&依赖 +kendo ui r1&kendo ui r1&依赖 +npm&g expo-cli Use Expo&依赖 +npm&React Native app&依赖 +component&Url&依赖 +component&file system item&依赖 +we&dependency&依赖 +package babel-plugin-styled-component&documentation&依赖 +your&connector& +you&it&依赖 +you&what&依赖 +our&demo& +you&it&依赖 +you&what&依赖 +container folder script = > react folder&file&依赖 +container folder script = > react folder&file&依赖 +container folder script = > react folder&new item dialog popup&依赖 +container folder script = > react folder&new item dialog popup&依赖 +container folder script = > react folder&new item dialog popup&依赖 +container folder script = > react folder&new item dialog popup&依赖 +container folder script = > react folder&file&依赖 +container folder script = > react folder&file&依赖 +node package manager ( npm )&web developer tool belt&依赖 +one&most demanded gadget&AGGREGATION +node package manager ( npm )&most demanded gadget&依赖 +You&Task Manager&依赖 +You&2 option&依赖 +async function&webpack config&依赖 +we&way&依赖 +we&massive e-commerce application&依赖 +Free Web File Thunar&Benedikt Meurer&依赖 +Xfce&manager& +Ignite UI&most complete Microsoft Excel solution&依赖 +Ignite UI&most complete Microsoft Excel solution&依赖 +its&own& +png extension ) Let&quick look&依赖 +you&" Task Manager " app&依赖 +Work '&export const fileitem = [ { ' name '&依赖 +Custom File System Provider&custom api&实现 +Custom File System Provider&you&实现 +export const fileitem = [ { ' name '&export const fileitem = [ { ' name '&依赖 +Work '&[ { ' name '&依赖 +{&name& +it&click&依赖 +it&file manager&依赖 +Webix&ready-made solution&依赖 +I&Laravel + React&依赖 +I&demo&依赖 +We&TypeScript&依赖 +We&website&依赖 +We&Gatsby&依赖 +our&CLI& +we&what&依赖 +You&Dropzone component&依赖 +Dropzone component&component&GENERALIZATION +your&domain& +child component&you application&AGGREGATION +many way&programming problem&依赖 +many way&programming problem&依赖 +we&file (&依赖 +we&first component&依赖 +npm package&package&GENERALIZATION +One common way&CSS&依赖 +yarn&react-dom yarn&依赖 +React&component&GENERALIZATION +article&simple way&依赖 +article&approach&实现 +You&custom color&依赖 +You&folder and tag&依赖 +net /&/&依赖 +we&Laravel ’s Storage API&依赖 +you&essential j 2 file manager component&依赖 +you&application&依赖 +all basic file handling mechanism&all basic file handling mechanism&依赖 +all basic file handling mechanism&all basic file handling mechanism&依赖 +all basic file handling mechanism&upload , download , read , edit , delete , search&依赖 +all basic file handling mechanism&upload , download , read , edit , delete , search&依赖 +FileManager UI component&file system&依赖 +com&team&依赖 +com&delhi/ncr ( india ) employment&依赖 +com&delhi/ncr ( india ) ctc&依赖 +our&team& +com&React JS Developers&依赖 +Permanent Employment Place&Work&AGGREGATION +component&provider& +React&code convention&依赖 +React&strict rule&依赖 +Redux side&thing&AGGREGATION +site&different source&依赖 +we&orthodox WEB file manager&依赖 +analogue&ncdu )&AGGREGATION +we&idea&依赖 +we&working&依赖 +server&site& +lot&other great stuff&AGGREGATION +file upload form&traditional HTML site&依赖 +file upload form&page refresh&依赖 +Chocolatey&w/SCCM&依赖 +React File Manager component&easy uploading and downloading&依赖 +easy uploading and downloading&file&AGGREGATION +React File Manager component&file&依赖 +React File Manager component&File Manager component&GENERALIZATION +React File Manager component&file in ###&依赖 +I&a page “ commercial file&依赖 +I&file&依赖 +I&example&依赖 +I&shortcode correspond&依赖 +I&shortcode correspond&依赖 +folder&file&AGGREGATION +React&software engineer&依赖 +React&Jordan Walke&依赖 +React&working&依赖 +npm&npm run start Design&依赖 +I&react&实现 +I&simple file explorer&依赖 +one&file&AGGREGATION +your&results& +compiler strip&process&依赖 +signature&type&AGGREGATION +compiler strip&function and method body&依赖 +compiler strip&process&依赖 +compiler strip&function and method body&依赖 +You&sub-folder&依赖 +React Filemanager Hello ex angular-filemanager user and&React&依赖 +It&laborasyon&依赖 +It&ThemeForest&依赖 +we&image&依赖 +we&tutorial&依赖 +we&react js component&依赖 +you&optional Yarn package manager&依赖 +File Manager component&files and folder&依赖 +File Manager component&multiple selection&依赖 +File Manager component&files and folder&依赖 +multiple selection&files and folder&AGGREGATION +File Manager component&multiple selection&依赖 +a ready-made set&icon&AGGREGATION +It&beautiful design&依赖 +we&80 react widget and plugin&依赖 +string index&sequence – Python&依赖 +string index&array element&依赖 +it&live change&依赖 +issue&thing&依赖 +issue&lot&依赖 +issue&thing&依赖 +issue&lot&依赖 +lot&thing&AGGREGATION +this package support multiple file selection&cloud storage integration&依赖 +this package support multiple file selection&this package support multiple file selection&依赖 +this package support multiple file selection&this package support multiple file selection&依赖 +this package support multiple file selection&cloud storage integration&依赖 +least two field&name and version&依赖 +least two field&definition file&依赖 +definition file&file&GENERALIZATION +new bordered & dark layout new ecommerce dashboard invoice bamburgh react admin dashboard&React&依赖 +0 ] – 2020-11-28 HTML , HTML + Laravel ADDED All-new design&new bordered & dark layout new ecommerce dashboard invoice bamburgh react admin dashboard&依赖 +0 ] – 2020-11-28 HTML , HTML + Laravel ADDED All-new design&Reactstrap PRO&依赖 +APP&green circle button&依赖 +my&APP& +we&dependency&依赖 +we&npx&依赖 +Download Epic React – HR Management Admin Template&commercial use&依赖 +item&you&依赖 +Download Epic React – HR Management Admin Template&download link&依赖 +Download Epic React – HR Management Admin Template&developer puffintheme&依赖 +Minor fix&RTL SCSS&AGGREGATION +npm&react-dom npm install&依赖 +your&Fodor& +It&React framework&依赖 +File Manager&upload&依赖 +File Manager&new file&依赖 +browser&it&依赖 +example&integration usage&AGGREGATION +you&example&依赖 +you&integration usage&依赖 +It&large UI collection&依赖 +import React&import { filemanager , filenavigator }&依赖 +import React&react-filemanager&依赖 +/&react-filemanager&GENERALIZATION +FileManager&operation&依赖 +control&Telerik UI&依赖 +control&ASP&依赖 +part&Telerik UI&AGGREGATION +api&azure-file-system&依赖 +api&client&实现 +api&access&实现 +api&Azure Blob Storage&实现 +banzay/friends-app-redux second take&friends app&依赖 +Excel Viewer widget&) edition webix community ( opensource&依赖 +NET Core FileManager&user&依赖 +your&users& +their&applications& +domain&‘ public_html ’ folder&依赖 +Your&domain& +domain&top ‘ index&依赖 +folder&required React Native iOS bridge&依赖 +You&folder&依赖 +folder&single framework&依赖 +you&Table service&依赖 +you&state information&依赖 +web-based gaming experience&two part&依赖 +its&core& +file manager&culture&依赖 +Predefined connector&Server Node API v1 Localization&依赖 +Predefined connector&React FileManager component&依赖 +texts and message&file manager&AGGREGATION +babelrc file&present&依赖 +Cloudinary&it&依赖 +DOM&file ( eg&依赖 +File Manager&you&依赖 +content&package&AGGREGATION +basic file operation&file manager component&依赖 +basic file operation&file manager component&依赖 +all later&Pocket&依赖 +your&client& +your&grid& +part&UI framework&AGGREGATION +component&native iOS/Android file viewer&依赖 +our&application& +we&file&依赖 +we&file picker&依赖 +I&laravel application&依赖 +file&content& +I&file manager package&依赖 +I&you&依赖 +Install Step 1 npm i react-native-azure-blob-storage-manager&Manual Installation Installation&依赖 +We&react-dropzone&依赖 diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt b/src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt new file mode 100644 index 0000000..600b501 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt @@ -0,0 +1 @@ +react file manager All components included in this dashboard template has been developed to bring all the potential of HTML5 and Bootstrap plus a set of new features (JS and CSS) ideal for your next dashboard admin theme or admin web application project. 확장성을 보유할것 외부 프로젝트에서도 Description. Redux helps you write applications that behave consistently, run in different environments (client, server, and native), and are easy to test. It has a beautiful design, as you can see from the live previews and it contains a LOT of components and features. filemanager namespace exposes the FileManagerCommand class that could be extended to implement a custom File Manager command. Just display a list within 2 predifined tabs (folders). Create React App - TS docs; Next. The Edit screen with option to select one or more files is displayed. Add Start script to package. 9,676 4. Inbuilt Search textbox in FileManager: See Also. Module files are represented in the design manager in a multi-pane module editor. To include the File Manager component in application import the FileManagerComponent from ej2-react-filemanager package in App. 1 - 28 November 2020 ----- - Upgraded Bootstrap version to 4. Filemanager with React & Nodejs . prod. The download manager handles HTTP connections, monitors connectivity changes, reboots, and ensures each download completes successfully. I would like this shortcode to be dynamic, i. Grab the demo from Github if you haven't done this yet. Mobile applications definitely offer a greater value to businesses than their mobile website In this tutorials we will use a package named @react-native-community/checkbox to add checkboxes in react native. Express your opinions freely and help others including your future self You can customize Storybook's webpack setup by providing a webpackFinal field in . 4. 3. import React from 'react'; import 'devextreme/dist/css/dx. js, Express and TypeScript. Install the React components and choose a theme that suits your needs. target. 2 - Ability to translate Wireframes and PSD Designs into functional web apps using HTML5, React , Node. In this tutorial you will learn how to create a working file upload component with react from scratch using no dependencies other than react itself. 2/6. /. You can rearrange the order of your files by dragging them around to move the important files to the top of the list for faster access. Run the Drupal Page having React Nested modals aren’t supported, but if you really need them the underlying react-overlays can support them if you're willing. Download the corresponding App Center SDK for iOS frameworks provided as a zip file and unzip it. NET Core suite along with 100+ fully-featured UI components designed to speed up delivery & improve every aspect of target. You’ll see a plus symbol to the left of the file or folder. com and its affiliated web properties is provided "as is" without warranty of any kind. An electron based file manager. The file manager application is like the heart of a smartphone. Modal's "trap" focus in them, ensuring the keyboard navigation cycles through the modal, and not the rest of the page. Async uploading with AJAX, or encode files as base64 data and send along form post. Overview of Kendo UI FileManager; Sort in Kendo UI FileManager; Toolbar Commands in Kendo UI FileManager Express your opinions freely and help others including your future self I am a beginner in react. LibraryManager. Developed with the latest jQuery plugins. html and . Complete file and folder manager: Create, rename, move and delete a folder. It's very important for me your collaboration on my development tasks and time. Test your JavaScript, CSS, HTML or CoffeeScript online with JSFiddle code editor. Go to react_code\src and change the apiUrl inside config. js as per your current url of Drupal. rtl8761a_mp_chip_bt40_fw_asic_rom_patch_8192ee_new. Say “EDIT MODE”. 1. To enable profiling in production mode, modify Webpack configuration file (config/webpack. To download and start utilizing Syncfusion's Essential Studio for React components, see our pricing model. A simple file manager built with react. azurewebsites. 0. Vue. Updated laravel 7 to all full version and starter-kit; React Fixed. mp4 videos to the server. Learn to build modern web applications using Angular, React & Vue! File Upload Component with Vue. A file input (dropzone) management component for React. TIP: If you have never seen a dot file (a file starting with a dot) it might be odd at first because that file might not appear in your file manager, as it’s a hidden file. Unlike vanilla Bootstrap, autoFocus works in Modals because React handles the implementation Free download Filedash – File Manager Dashboard Nulled. Maybe later i can have a button to have the grid view File-Manager 개발정의서 들어가며 본 문서는 인수인계 목적이 아닌 개발이 완료된 제품에 대한 이해를 돕기위해 제작된 개발 정의서입니다. Say for instance that you want to open the file select dialogue for a user to select an file to upload. This sample demonstrates how to utilize the Amazon S3 file system provider to manage the files in File Manager component. Deploy Trillo File Manager from GCP Marketplace In this tutorials we will use a package named @react-native-community/checkbox to add checkboxes in react native. Choose a device definition, Nexus 5X is suggestable. Create a new project with React Native. React also allows us to create reusable UI components. Use Git or checkout with SVN using the web URL. bs4 File Manager. v6. js . Source code: https://bit. Learn more . log(event. Also, you might want to customize the look of the file input in the form to make it resonate with your overall app design. Chocolatey is trusted by businesses to manage software deployments. Conclusion Let’s work that out. Scheduler. svg'; // replace it with your path // Profile upload helper const HandleImageUpload = => { // we are referencing the file input const imageRef = useRef(); // Specify the default image const [defaultUserImage React Filemanager. Download Nulled Filedash – File Manager Dashboard. 1 - Added new Scrollable layout. x, Columns: 4+. FTP Access Upload files via FTP Need easier and faster way to upload and download. The default locale of the file manager is en (English). In our editor / file manager we should see a . It is distributed through NPM under the kendo-react-upload package. It was initially called Filer but was changed to Thunar due to a name clash. It can be used as a standalone app or as a middleware. I will try to make it clean and retro-compatible with the previous bridges/connectors. When it comes to both of these issues, React can help you provide a better user experience. Themes and Skinning JavaScript - jQuery, Angular, React, Vue React Data Grid. Build files will be created build. Select, Copy, Paste, and Delete. Python dictionary add, delete, update, exists keys with performance; java. react-dropzone is a React’s implementation of popular drag and drop library for file uploading. And in our opinion, the Webix library offers the best solution available on the market. Free bootstrap snippets, examples and resources built with html, css and js. Adding React File Manager for PDF Library In the previous section, we added the File Server Node API component from filemanager (by -OpusCapita) . So follow the below setups:- 1) Install the @react-native-community/checkbox package like below in your application 2) Link the module in your application 3) Import Free React Design System For Bootstrap 4 (reactstrap) 9,824 4. You can add spans to any grid element, fine-tune the table sizes, specify the columns’ auto width, and freeze one or more columns. Folder based file browser given a flat keyed list of objects, powered by React. 10. Client React connector for Google Drive API v2; Detailed documentation for each package is coming soon. You can fire up the project with dotnet run to see what the scaffold does for you. /assets/images/defaultUser. It is fully responsive, built with Bootstrap 4 Framework, HTML5, CSS3 and SCSS. The editor is the whole CodeSandbox application (file manager, code editor, dependency settings) and the preview is the result you see on the right. Extension for Visual Studio Code - Simple extensions for React, Redux and Graphql in JS/TS with ES7 syntax Another file format that uses the MD file extension is Moneydance Financial Data. import React, { useEffect, useRef, useState } from 'react'; // Specify camera icon to replace button text import camera from '. - Added Blog List, Blog Grid, Blog Details pages. Site Navigation and Layout. React Native This is an exact mirror of the React Native project, A lightweight and easy-to-use password manager Clonezilla. All the operating systems got a file manager to filter the required files. Create React App – How to Create and Deploy a React Application to Production. and we can drill down into various modules. 5. 0 To do so, right-click the libman. By default, Storybook's webpack configuration will allow you to: Import Images and other static files Semantic UI React provides React components while Semantic UI provides themes as CSS stylesheets. mov, . (Ex – Facebook, Twitter and Google. Then add the File Manager component as shown in below code example. Web. View . This is one of the admin tools that our customers manage their static files on shared host. Initially, the selectedFilestate is set to null The FileBrowser dialogs consist of a FileBrowser object, an object previewer/property manager and a file uploader tab. Let’s install Bootstrap and React. ” - [source] You can delete the files from My Media, My Documents or My Photos folders. Managing your React. Site Navigation and Layout. This can be done in one of two ways: Run bower install --save for each package (the --save flag adds the dependencies (name and version) to the bower. fThe file is called : "FirstReactApp. bs4 File Manager. A partition and disk Adds React debugging tools to the Chrome Developer Tools. This is a Sample React Plugin for Apache OODT File Manager. The FileBrowser dialogs consist of a FileBrowser object, an object previewer/property manager and a file uploader tab. Thunar is designed to start up faster and be more responsive than some other Linux file managers, such as Nautilus and Konqueror. rtl8761a_mp_chip_bt40_fw_asic_rom_patch_8812ae_new. This is an example file with default selections. new file manager windows 10 Executive Summary These course materials were originally designed for Google managers to help them transition from an individual contributor role to a manager role. jsx". dll and React. filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. Files. json must be written in JSON. I will try to make it clean and retro-compatible with the previous bridges/connectors It's very important for me your collaboration on my development tasks and time. They are not part of the template and NOT included in the final purchase files. So in the above imports, the files would be CartTotal. In XCode, in the project navigator, right click Libraries Add Files to [your project's name] Go to node_modules react-native-file-manager and add the . LibraryManager. You can go for either an HTML5 drag & drop file uploader or use the traditional way. json file is saved. I want somebody who can redo what has been done and finish it. On the file manager for a domain you have a ‘public_html’ folder. dll (if using MVC 4) in your Web Application project Your first build always needs to be done using the build script ( dev-build. The FileBrowser provides the ability to browse directories and locate a file item. Downloading the file. cs ). ) Wrap long file names in the File Manager’s detail view Customize icons in the Folder Tree. com, lands you with the opportunity of working with a leading technology organization. v 2. You Install react-file-reader (A flexible ReactJS component for handling styled HTML file inputs. files[0]) } On saving, create-react-app will instantly refresh the browser. babelrc configuration file. Looking for the best react native app development companies? Here is the list of the top React native developers with reviews by ADA. Unfortunately it can be quite intimidating. if I add/remove files in File Manager, it will react dynamically on the front-side (so I don’t need to modify the shortcode or put a React is a popular open-source JavaScript library – many of you asked for an easier integration between Power BI and React web applications. Free bootstrap snippets, examples and resources tagged with file-manager, html, css and js. Themes and Skinning JavaScript - jQuery, Angular, React, Vue React Data Grid. Please help me to move forward with a donation by paypal :) The file manager component is used to browse, manage, and organize the files and folders in a file system through a web application. js. js file to a . Build) to the project, which will trigger a restore as part of project build. json file and choose “Enable Restore on Build”. Any FOSS lover is warmly welcomed A lot of people name React components with a capital letter in the file, to distinguish them from regular JavaScript files. To delete one or more files, 1. When viewing a module locally, the files are contained within module-name. Input A file input management component for React. WP Media Folder v5. Upload React website to subdomain Open File Manager Create new folder inside “public_html” Upload whole content of “build” folder into this new created folder. The “React JS Developer” role at one. How can I create a custom command for the Kendo UI File Manager? Creating a Custom Command. Restore on demand Library Manager will restore client-side libraries whenever the libman. It allows the creation of multiple users and each user can have its own directory. In this tutorial we are going to create a task manager application from scratch with react. Once a file item is selected, it (or its properties) is loaded in the previewer. The DevExtreme JavaScript FileManager component allows you to display and manage files and directories for different file systems. To make the functions work as expected, I transpile these into CommonJS format in addition to transpiling React JSX files. 부디 도움이 되길 바랄 뿐입니다. It's a command-line utility connected with the corresponding online repository of packages and is capable of package installation, version management, and dependency management. Step 9: Configuring AVD Manager. This time with Trillo File Manager is an application for Dropbox-like functionality on the top of the GCS cloud storage bucket. However, you don’t want to use the standard file input HTML element, instead use a styled link or button to show the file window. 3 - Binding of UI elements to JavaScript object models. 2. React is one of the best choices for building modern web applications. js file. Default configuration. This is a Sample React Plugin for Apache OODT File Manager. React has a slim API, a robust and evolving ecosystem and a great community. If nothing happens, download Xcode and try again. com and its affiliated web properties is provided "as is" without warranty of any kind. After downloading the installation file of it, double click on it and proceed with the installation. The KendoReact Upload component is part of the KendoReact library of React UI components. common. Say “EDIT MODE”. json React Component by Creating. You can delete the files from My Media, My Documents or My Photos folders. The new React component supports both JavaScript and TypeScript and will help you embed your analytics in a React web application. Our file caching system will have two main parts. Tailor fman to your needs with its powerful plugin system. React can handle a single button, a few pieces of an interface, or an app's entire user interface. js. Requirements Creating a File Upload Component with React. react-native-azure-blob-storage-manager. npm install react-files --save Usage Basic I don't think there is one, but it's such a strange question, React is used on the web as a frontend library, while a file manager runs on your local computer. Then use the Axios library to send the file request to the Laravel server and saves the image in the server. ReactOS is a free and open-source operating system for x86/x64 personal computers intended to be binary-compatible with computer programs and device drivers made for Windows Server 2003. Component { render() { return ( ); } } export default App; File Manager can be initialized using the tag. npm start To create a new build inside dist directory. Disclaimer: The information provided on DevExpress. Download Manager is a system service which optimizes the handling of long-running downloads in the background. The first is a React component, which will wrap around RNFetchBlob’s functionality and respond to changes in the Redux store. This method of deleting corrupted files requires you to close "Windows Explorer" through "Task Manager". json. A list of its key features is given below. The MD file stores transactions, budgets, stock information, bank accounts, and other related data for the Moneydance finance software. The second is a set of actions and reducers on the Redux store which deal specifically with file caching. apiOptions, apiRoot: `http://opuscapita-filemanager-demo-master. Integrate TinyMCE editor in Laravel with a File Manager / Image Upload Jquery PHP July 27, 2019 2,006 views Create Sortable, drag and drop multi-level list with jquery like wordpress menu page All Webix widgets and applications function well in the Angular or React environment. Today we will create File Manager App UI with animation using React Native. Sweet Alert in dark layout; Design Files Removed. Installation. Free bootstrap snippets, examples and resources tagged with file-manager, html, css and js. . dll. When a TypeScript script gets compiled there is an option to generate a declaration file (with the extension . You have high end protection; It also has a file manager that is easy to access. With React, you can create reusable components that are independent of each other. Use the Download button in the toolbar. The following table represents the default texts and messages of the file manager in en culture. This project based course will introduce you to all of the modern toolchain of a React developer in 2020. For example, users can upload images, videos, etc on Facebook, Instagram. Source + Demo. Data List; React DataTable Component Vue based front-end for File Manager Aug 01, 2018 1 min read. To associate your repository with the react-electron topic, visit your repo's landing page and select "manage topics. . 6. Benefits of Hosting React. This will add the LibraryManager NuGet package (Microsoft. Add events to precisely control file/folder operations (folder creation, file uploading, moving, deleting, etc. 6. Go through the following steps for creating React project to download file from server using React. A full list of the compatible frameworks and integration examples you can find on this page . Files and folders in the file system can be sorted in either ascending or descending order simply by npm install --save @opuscapita/react-filemanager @opuscapita/react-filemanager-connector-node-v1. If nothing happens, download GitHub Desktop and try again. import ReactFileReader from 'react-file-reader'; class Because the other files & folders above (some truncated) are usually part of a default react-native init installation, our focus would be on the src folder:. tsx. 5, npm 6. Drag & Drop your files in folders: Drag & Drop and image to move it into a folder, where you can find other files. To configure the AVD Manager click on the respective icon in the menu bar. These first have been selected by most active users and ranking has been given based on the most popular votes. Accessible , tested with AT software like VoiceOver and JAWS, navigable by Keyboard . changing a . target. Install from NPM and include it in your own React build process (using Browserify, Webpack, etc). The project is about uploading a users products/services. The name npm (Node Package Manager) stems from when npm first was created as a package manager for Node. If multiple packages depend on a package - jQuery for example - Bower will download jQuery just once. React. View . Communicating react with asp. holyidiot updated Vuexy - Vuejs, React, HTML & Laravel Admin Dashboard Template with a new update entry: Update [6. 0] – 2020-11-28 Latest Update [6. ts) that functions as an interface to the components in the compiled JavaScript. Added 2021-01-09 file-manager,file-browser spofly Desktop app to find lyrics of currently playing song on spotify. You have two options for creating a file uploader. ReactOS will only be compatible with computers that are compatible with Windows 2003 or XP. ej2-react-filemanager. Basic usage. Any FOSS lover is warmly welcomed React Native ; Bootstrap file-manager examples. Bower provides hooks to facilitate using packages in your tools and workflows. jsx" Select Web => JSX File, and enter file name "FirstReactApp. The FileManager provides an inbuilt Search functionality, allowing you to find the specific file in the currently selected folder. React File Manager: A Lightweight & Customizable Component File upload and download. File Browser Front-end. Paper Kit ReactOS is a free, opensource reimplementation of windows Related: How to Copy and Paste Text, Files and Folders in Linux Terminal. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. Removed complementary design files from the package [5. Uploading Files using HTML5 Uploader. TagSpaces features basic file management operations, so it can be used as simple file manager. To associate your repository with the react-electron topic, visit your repo's landing page and select "manage topics. dhtmlxGrid contains rich API functionality. This is an unparalleled array of features, design elements and reusable components Introduction to Asus file manager. To do so, right-click the libman. /assets/images/camera. Try All UI Components for Free All UI components for React are part of the dhtmlxSuite library. Changing the Webpack config. Add multiple URL to pocket at a time. Create better React apps faster and add data visualizations with the world's fastest, virtualized, real-time React data grid and streaming financial and business charts. File uploading means a user from a client machine wants to upload files to the server. net core on remote server (httpdocs folder) does not work RSS 0 replies Last post 2 hours, 59 minutes ago by fiazahmed An electron based file manager. 10 – WordPress File Manager Using the default WordPress media manager also means that the plugin will be very compatible with all the other plugins you use. It’s not a visual file manager, but it gives a set of functions to easily handle media/files in your Laravel app. html’ file to run on start up. Once a file item is selected, it (or its properties) is loaded in the previewer. Read the full article at: http://bgwebagency. The presence of these handlers enables the buttons and/or the drag & drop responsiveness. (eg. However, newer versions of the program use . The FileManager uses file system providers to access file systems. fastlane/ This folder, as you might React doesn’t have opinions on how you put files into folders. files[0]) } On saving, create-react-app will instantly refresh the browser. No action needed. pdf file to use a . Firebase issue during npm install [5. The standard tool for this task is Babel. The create-react-app utility configures tools such as Babel and webpack for the client-side React application. Build) to the project, which will trigger a restore as part of project build. In this section, we are going to add the Client React component from OpusCapita for navigating the folders and listing the files in our PDF library. nyc_output and coverage folder containing our instrumentation detail. . In terms of frontend frameworks, this React admin dashboard is powered by Material-UI, which is the most popular material-based UI components framework available today. - Added File Manager Page. MONEYDANCE files instead. Blog Post. Page 16. lang. A file input (dropzone) management component for React. Videos: Manage member level settings & Videos created by Users. storybook/main. ) Channels: Manage member level settings & Channel created by Users. It enables the user to perform common file operations such as accessing, editing, uploading, downloading, and sorting files and folders. To upload a file with React and Laravel, create a React file component and backend in Laravel. 2. React Chart. The following sample is extracted from Android 4 ICS emulator image. Similarly, every smartphone has a file manager to view, edit, and create any text files, delete, sort, or rename, copy, and cut whenever required. All npm packages are defined in files called package. ). The official front-end framework for building experiences that fit seamlessly into Microsoft 365. Create shortcuts for files: Hold SHIFT and move a file with drag & drop to another folder in order to create a shortcut Bootstrap snippets. 1. js file. To select a specific file, you need to use the number assigned to it. See bundler defaults for the full list. Bower is optimized for the front-end. 15. React. This allows teams to set conventions that work best for them, and to adopt React in any way they would like to. It also supports uploading a file by dragging it from Windows Explorer to FileManager control. Cezerin is open-source ecommerce platform. Tailor your React grid component according to your needs. dll GitHub - networknt/react-file-manager: A react remote file manager with Light Framework as back end file system. Social Sites Integration: With one click, you can login to your site using Social Sites. Using the arrow keys, move over the desired file or folder and press Space on the keyboard. 9 all file uploads, including those initiated by the File Browser plugin, expect a JSON response (like this one ). In addition to building skills, this curriculum incorporates introspection, perspective shifting, and awareness building. These two parts are very decoupled and only communicate using postMessage. Plugin has two parts: Front-end & Back-end. Note that your changes would be temporary and will not persist between re-runs of your package manager. Other Feature Module in React template: Voice and Video Call File Manager Contacts and Email Departments and Designations Timesheet and Overtime Kanban Board Payroll, Payslip and Payrun Company Policies Performance, Goal Tracking, Training and Promotion Resignation and Termination Faq and Knowledgebase Profile Settings, Profile and Edit Profile 🎈 React Material-UI. August 08, 2018. Store the file in state, and only upload when a user clicks the upload button. Overview. This package help you to upload file and assests from react native project to your azure blob storage service. If you want to download large files/streaming you can use Android Download Manager. React components can be installed via yarn or npm: After install, import the minified CSS file in your app's entry file: File manager built with the help of Suite components: Layout, Grid, DataView, Toolbar, etc. js doesn’t have to be hard and with these few steps, you can do it yourself. js'; class App extends React. Use npm to install the Expo CLI command line utility from the Windows Command Prompt, PowerShell, Windows Terminal, or the integrated terminal in VS Code (View > Integrated Terminal). Clear the cache from admin panel. js , or Total. How you use packages is up to you. html file should reveal our code coverage in a human readable and hopefully revealing way. We will cd into react project react-file-upload – cd react-file-upload Now will install dependencies – npm install bootstrap npm install react-toastify npm install axios The bootstrap help to create ui based on bootstrap 4, react-toastify is use to display beautiful notification into react app and axios for HTTP client. Save time by quickly jumping to directories. CKEditor 4 can be easily integrated with an external file manager (file browser/uploader) thanks to the File Browser plugin which by default is included in the Standard and Full presets. A very smart filemanager to manage your files in the browser developed in AngularJS following Material Design styles by Jonas Sciangula Street. These files will always be rendered/loaded to the page when an instance of the module is on the page (Module instances are the individual rendered modules on the page). FileManager Conclusion To make a file downloadable from your website, start by creating a folder on your server for both your website's HTML page and the file you want to share. Select the file in the manager. It is often used for developing Web Applications or Mobile Apps. mp3, . Edit: But As a web app. 2. You can add a custom thumbnail and text description to every file or folder. That said there are a few common approaches popular in the ecosystem you may want to consider. changing a . Drag and Drop Support in React FileManager component 23 Feb 2021 / 1 minute to read The file manager allows files or folders to be moved from one folder to another by using the allowDragAndDrop property. Once you make the folder, you can find it by using your Control Panel's file manager or the file browser in your FTP program. In XCode, in the project navigator, select your project. files[0]holds the actual file and its details. react-file-manager. React Native ; Bootstrap file-manager examples. Download the App Center SDK for React Native frameworks provided as a zip file and unzip it. React, Node v12. A dual-pane file manager for Mac, Windows and Linux. Restore on demand Library Manager will restore client-side libraries whenever the libman. html, the rest of the website build in React shows nothing (white page). Set Api path for React. To connect the component with the file system items, assign the Remote File System Provider to the fileSystemProvider property. React File Manger Multi-column File Manager based on react-beautiful-dnd. React JS Developers one. js. Here are some of the best places to find up-to-date information on React and TypeScript: React TypeScript Cheatsheets React is a JavaScript library that aims to simplify development of visual interfaces. svg'; // replace it with your path // Specify your default image import defaultUser from '. json. File Manager. css'; import 'devextreme/dist/css/dx. js under dist/ directory. /. The FileBrowser provides the ability to browse directories and locate a file item. Chocolatey is software management automation for Windows that wraps installers, executables, zips, and scripts into compiled packages. React Chart. npm run build. files[0]holds the actual file and its details. This one is a little different. All of the files shared are under GPL License. Like a photo, pdf or any other file type. 3] - 2020-04-04 VueJS + Laravel, HTML + Laravel Updated. in/building-a-full-st Related Posts: How to download file from server using Angular; Prerequisites. Cronus File Manager Live Demo. Files files will be hosted on the server on a cloud service. js under dist/ directory. Allows creating a Progressive Web Apps built with React and Node. A flexible and beautiful Select Input control for ReactJS with multiselect, autocomplete and ajax support. You can add support for other types by adding an assetExts resolver option in your Metro Bower keeps track of these packages in a manifest file, bower. Please note that bluehost doesn’t upload folder and its content. Most common file types are supported including . Scheduler. Go to the My Media/My Documents/My Photos folder. If you don’t have that file already, you just create a blank file, and put that content into it. js is an open-source JavaScript library that is used for building user interfaces specifically for single-page applications. The KendoReact Upload helps users send files from their file systems to dedicated server handlers which are configured to receive them. Basic usage. Mobile applications definitely offer a greater value to businesses than their mobile website • Fixed Spell checker not working and missing Image Advanced Edit button in Node JS SDK • Fixed Unable to load any images or files Python Flask SDK • Fixed Upload Video not working in Rail SDk • Fixed On opening an uploaded file throws "HTTP status 404-Not Found" in Java SDK • Fixed Unable to upload images in Java SDK • Fixed On opening an uploaded file throws "Template is missing The require syntax described above can be used to statically include audio, video or document files in your project as well. If nothing happens, download GitHub Desktop and try again. xml :This file contain list . com and its affiliated web properties is provided "as is" without warranty of any kind. As of Kendo UI R1 2020 SP1 the kendo. Go to the My Media/My Documents/My Photos folder. Click on the Delete button. Material Dashboard React Nodejs . ) Simple Example. 2] - 2020-02-18 React Aaded. react-dom@^16. npm install -g expo-cli Use Expo to create a React Native app that runs on iOS, Android, and web. For the former, there is a library called react-dropzone that is built with React. File Operations. This happened right after updating the code when I tried to upload some . Pass the endpointUrl to the remote file system provider object to specify the Url at which the component can access the file system items. First we need to install the dependencies for React. ui. Note: In the documentation, the package babel-plugin-styled-components is specified, as well as a . This project provides a web file manager interface, allowing you to create your own backend connector following the connector API. 3 - Upgraded React version to 17. However, it is not designed to work with SSR. target. Mvc4. There’s nothing more to add, just check out our demo to get a clear idea of what you can do with it. It’s used for handling the view layer for web and mobile apps. jsx) by right clicking on container folder script => react folder select a file from new items dialog popup and click on Add button. /data. This is where Babel macros come in. 07 August 2019. This prod Nowadays, Node Package Manager (npm) is one of the most demanded gadgets in the web developer tool belt. You can open the Task Manager by 2 options. The value should be an async function that receives a webpack config and eventually returns a webpack config. js on cPanel. Like a photo, pdf or any other file type. Along the way, we will build a massive e-commerce application similar to Shopify using React, Redux, React Hooks, React Router, GraphQL, Context API, Firebase, Redux-Saga, Stripe + more. js on cPanel. bat ) as this generates a few files required by the build (such as SharedAssemblyVersionInfo. With this in place, feel free to open the solution file in Visual Studio or VS Code. Free Web File Thunar is developed by Benedikt Meurer, and was originally intended to replace XFFM, Xfce's previous file manager. React Scheduler Storybook is an open source tool for developing UI components in isolation for React, Vue, and Angular. Ignite UI for React also includes the most complete Microsoft Excel solution and 60+ chart types with interactive panning and zooming, touch support and much more. An online file manager which can be used on its own, or as a plugin for a rich-text editor such as CKeditor, TinyMCE or FCKeditor. png extension) Let’s take a quick look at how to manage those breaking user interactions: to the . Option 1: Type "task" in the search box beside the Start menu, and press Enter when you see the "Task Manager" app. /. export const fileItems = [{ 'name': 'Documents', 'isDirectory': true, 'category': 'Work', 'items': [{ 'name': 'Projects', 'isDirectory': true, 'category': 'Work The Custom File System Provider allows you to implement custom APIs to handle file operations (add, delete, rename, etc. Initially, the selectedFilestate is set to null Next time you’re looking for a file, it’s just a click away in the file manager. This will add the LibraryManager NuGet package (Microsoft. . The Edit screen with option to select one or more files is displayed. js) as shown below. Webix suggests a ready-made solution, which is JS File manager, that can be built into any web application. Fileside Modern, tiling file manager with unlimited panes. I have a demo on Laravel + React. React, Redux, Material UI, Nodejs, ExpressJs . We use Gatsby with TypeScript for this website, so that can also be a useful reference implementation. module folders. Work fast with our official CLI. To select a file or folder: 1. log(event. Store the file in state, and only upload when a user clicks the upload button. wav, . You can then use the Dropzone component to render the HTML5 Drag What we would like to see from a project manager is the following: - A candidate that can manage: 1 - Experience with React context api . 90/5. Declaration files. It come with unlimited customized email with your domain. Looking for the best react native app development companies? Here is the list of the top React native developers with reviews by ADA. To select a specific file, you need to use the number assigned to it. Angle - Responsive Bootstrap Admin Template. Use it as a child component of you application. As with any programming problem, there are many ways to achieve this outcome. Run npm install and npm start after that. For initialising file manager you have to install and run both of them from terminal with commands . 3. 5. react-files. /. A predictable state container for JavaScript apps. xcodeproj file. JSX Now, we need to create a first component to create a file (. A simple file manager built with react. Client implementation is an npm package which can be embed into your application. Grouping by features or routes One common way to structure projects is to locate CSS, JS, and tests together inside folders grouped by feature or route. yarn add react yarn add react-dom yarn add --dev parcel-bundler. 11, React 16/17. The File Manager is a graphical user interface component used to manage the file system. mp4, . Delete a file. Web. expo-file-system ( docs) expo-media-library ( docs) After you’ve done that we can proceed. Create shortcuts for files: Hold SHIFT and move a file with drag & drop to another folder in order to create a shortcut There are several possible ways of using Webix with React: using a Webix widget in a React app; creating a custom Webix+React component; using a Webix widget with Redux; How to Start. Option 1: Package Manager. This article explains a simple way to implement the approach to upload a single file with React. Software Package Manager. View demo Download Source. Say “MORE OPTIONS” 3. Free . You can assign custom color to every folder and tag, which makes the visual search an easy step. - Fixed minor bugs. net/` // Or you React File Manager Usage (iOS) First you need to install react-native-file-manager: npm install react-native-file-manager --save. " File Manager. Step 8: Configuring AVD Manager. On the backend, we are going to use Laravel’s Storage API to store images. Now, you can start adding Essential JS 2 File Manager component to the application. 3. All basic file handling mechanisms like upload, download, read, edit, delete, search, and sort can be performed to manage and organize the files and folder in a file system. ly/3d8cXTx To learn more about the react-native visit: The FileManager UI component can work with a file system located on the server. Angular React Vue jQuery PeaZip is a free archiver tool. config. com is looking for React JS Developers for our team in Delhi/NCR (India) Employment: Permanent Employment Place of Work: Delhi/NCR (India) CTC: Best in the industry Role. Complete file and folder manager: Create, rename, move and delete a folder. Reference React. 0 / scheduler@^0. Use the fileSystemProvider property to configure the component's file system provider. Video-React is a web video player built from the ground up for an HTML5 world using React library. Let’s begin with the Redux side of things: The Redux Code Unlike the other frameworks covered in this module, React does not enforce strict rules around code conventions or file organization. Free Frontend Preset For Nodejs . That's when we got the idea to create an orthodox WEB file manager, working on the server's site, which would be able to copy between different sources with server speed and would offer: file and directory search, a disk usage analyzer (an analogue of ncdu), simple file uploading and a lot of other great stuff. In traditional HTML sites, the file upload form forces a page refresh, which might be confusing to users. Chocolatey integrates w/SCCM, Puppet, Chef, etc. The React File Manager component allows for the easy uploading and downloading of files in a Sorting. KFM – Kae’s File Manager. Webix File Manager is a ready-made SPA. " For example, I prepare a page “Commercial files” where I will put a shortcode corresponding to the folder of files uploaded in File Manager or Google Drive. React was first created by Jordan Walke, a software engineer working for Facebook. Web The JavaScript Client Library for Azure Storage enables many web development scenarios using storage services like Blob, Table, Queue, and File, and is compatible with modern browsers. npm install npm run start Design. thumbnail support for image files; built-in media player; text editor; many other features. I want to do a very simple file explorer in react that look like the one of Files for google. Multi-Selection. js, and Mongo. React Shopping Cart. More Template Epic React - HR Management Admin Template is High Resolution: Yes, Compatible Browsers: Firefox, Safari, Opera, Chrome, Edge, Compatible With: ReactJS, Bootstrap 4. These first have been selected by most active users and ranking has been given based on the most popular votes. So follow the below setups:- 1) Install the @react-native-community/checkbox package like below in your application 2) Link the module in your application 3) Import Get code examples like "usenavigate react" instantly right from your google search results with the Grepper Chrome Extension. 6. Disclaimer: The information provided on DevExpress. 0/v14. css'; import FileManager from 'devextreme-react/file-manager'; import { fileItems } from '. Since CKEditor 4. In the process the compiler strips away all function and method bodies and preserves only the signatures of the types that are exported. You have to manually create sub-folder, then upload files into that folder. React Filemanager Hello ex angular-filemanager user, this is the new version in React. The application provides an unified, natively portable, cross-platform file manager and archive manager GUI for many Open Source technologies like 7-Zip, FreeArc, PAQ, UPX. But first, here are the benefits of hosting your React. The ASP. It is developed by laborasyon on ThemeForest. In this tutorial, we will upload an image from the react js component. 80/5. React is an open-source JavaScript library developed by Facebook used for creating web frontend and UI components. 14. File Manager and Core Data: Used to save photo, video, audio, and pdf data to the ios device url sessions: Used to communicated with the server to upload the data to the Utah State Geographical Cuba admin is super flexible, powerful, clean & modern responsive bootstrap 5 admin template with unlimited possibilities. Or if you have the optional Yarn package manager installed. React & JavaScript articles. The File Manager component supports multiple selections of files and folders in a file system. Storybook - GitHub Pages angular-filemanager. It is worth noting the beautiful design, and a ready-made set of icons, which are included in the delivery. 10. Work fast with our official CLI. Beside Material-UI, we also integrated, with the same design style, over 80 React widgets and plugins. Click on the Next button you will see a System React Fixed. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. NullPointerException; TypeError: string indices must be integers – Python; valueerror: setting an array element with a sequence – Python; TypeError: a bytes-like object is required, not ‘str’ – Python Drop files, select on filesystem, copy and paste files, or add files using the API. To start the app server it will display live changes (optional) 4. 그럼 스타뜨! 배경 DCE내에서 파일 업로드 및 관리를 할수 있는 GUI 화면이 필요했다. React Scheduler Disclaimer: The information provided on DevExpress. The issue with this is that, because we’re using create-react-app, we can’t configure a lot of things unless we eject. This package support multiple files selection, cloud storage integration. Creating a file upload component is a common task in web development. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. At least two fields must be present in the definition file: name and version. 0] – 2020-11-28 HTML, HTML + Laravel ADDED All-new design based on Ul/UX principles New Bordered & Dark layout New eCommerce Dashboard Invoice Bamburgh React Admin Dashboard with Reactstrap PRO is built entirely on React and uses the popular starter kit Create React App from Facebook. Now my APP only show that green circle button located in index. e. Just be sure to follow the installation instructions for “bare” or plain react-native apps. json file. Build files will be created build. First, we install dependencies using npx then download the laravel project. 4. Download Epic React – HR Management Admin Template nulled from the below download links and if the item satisfy you then buy it from the developer puffintheme for commercial use. - Minor fixes of RTL SCSS. npm install --save react npm install --save react-dom npm install --save-dev parcel-bundler. js - TS docs; Gatsby - TS Docs; All of these are great starting points. Finally, what all this was leading up to, opening that index. I guess it's technically possible to write a file manager in Node, use React for the UI, and package it as a desktop app with Electron, but I would still not call that "React based" (and C. js in your Greg Fodor - Engineering Manager Mozilla The development team involved have been very impressed by the React Admin framework and it has been capable of handling the complex challenges we have had for it thusfar. It uses React framework and supports connectors to different file storages. Drag & Drop your files in folders: Drag & Drop and image to move it into a folder, where you can find other files. File Manager: Admin can import/export & upload new files. packages. Simple event handlers are also provided as props to the browser, which allow it to respond to actions on the files. Thus you will get an example of integration usage. onChangeHandler=event=>{ console. . It has a large UI collection. dll. onChangeHandler=event=>{ console. import React from 'react'; import ReactDOM from 'react-dom'; import { FileManager, FileNavigator } from '@opuscapita/react-filemanager'; import connectorNodeV1 from '@opuscapita/react-filemanager-connector-node-v1'; const apiOptions = { connectorNodeV1. json file is saved. API-first CMS. json file and choose “Enable Restore on Build”. FileManager also performs operations like creating a new folder, moving files, and searching. This control is part of the Telerik UI for ASP. Created from revision f160547f47 on 12/4/2020. All APIs that implement access to Azure Blob Storage on the client are stored in the azure-file-system. banzay/friends-app-redux Second take on friends app. 4 - Creating RESTful services with Package Manager stores application information in three files, located in /data/system. Is the Excel Viewer widget compatible with the Webix community (opensource) edition? PHP & MySQL Projects for $2 - $10. rtl8761a_mp_chip_bt40_fw_asic_rom_patch_8192eu_new. d. Select the file to upload from the file selector dialog box; Downloading a file. pdf. NET Core FileManager lets your users browse through directories and files, akin to file managers like Windows Explorer, and manage file storage within their web applications. spatie/laravel-medialibrary Released: August 2015 Installs: 178 000 Last update: May 2017 (1 day ago). Note the command dotnet new react; this is the template I’m using for this React project. Your domain will look in this ‘public_html’ folder for a top ‘index. You'll see a folder named AppCenterReactNativeShared which contains a single framework for the required React Native iOS bridge. Be it a web-based gaming experience where you store state information in the Table service, uploading photos to a Blob account from a Mobile app, or an entire CodeSandbox at its core consists of two parts: the editor and the preview. Predefined connectors are: Client React connector for Server Node API v1 Localization in React FileManager component The file manager can be localized to any culture by defining the texts and messages of the file manager in the corresponding culture. babelrc file present in the application root folder. jpeg extension) Uploading an image where the file extension has been intentionally changed and Cloudinary could process it, but the DOM could not render the file (eg. Web based File Manager Manage files online From within the free control panel, an easy to use File Manager helps you to upload files, download files or even edit HTML, PHP or other programming language files. 2. The content of package. Create a new file called manager. All basic file operations like creating a new folder, uploading and downloading of files in the file system, and deleting and renaming of existing files and folders are available in the file manager component. Used technologies. askwon/Filet-Manager Web-based file transfer client written in React, Redux, and Go; ayxos/react-cellar Typescript, MongoDb, Webpack, EC6, Typings, Redux Wine-Cellar; azu/read-all-later [Electron] Read All Later is a client for Pocket. - Added New Auth pages. To run the service, create an Amazon S3 account and a S3 bucket and then register your amazon S3 client account details like bucketName, awsAccessKeyId, awsSecretKeyId and awsRegion details in RegisterAmazonS3 method to perform the file operations. 9. 5. Angle is an admin template based on Bootstrap and multiple frameworks. Personalize your React grid with flexible API. Organizing your blog media files with the Real Media Library plugin is as easy as dragging and dropping them into folders. JavaScript File Manager or in other words File Explorer is a web widget, part of the UI framework for managing files. Developed at Facebook and released to the world in 2013, it drives some of the most widely used apps, powering Facebook and Instagram among countless other applications. light. . Here native file viewer means we are not going to view the file in our application instead we will pick the file from file picker and will pass the file URL to FileViewer component provided by react-native-file-viewer, this component will trigger the native iOS/Android file viewer to open the file. Say “MORE OPTIONS” 3. ). To delete one or more files, 1. To download a remote file’s content to a local file on the device, here’s the code: Hi Dev, In this blog, I will show you how to install file manager package in laravel application. Install Step 1 npm i react-native-azure-blob-storage-manager --save Step 2 Dependencies npm install --save react-native-background-upload iOS cd ios pod install Manual Installation Installation. Node. Use Git or checkout with SVN using the web URL. Page 16. Documentation. We are going to use react-dropzone to build an image uploader. Hello ex angular-filemanager user, this is the new version in React. react file manager diff --git a/src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt.xml.xls b/src/main/resources/sdtocode/doc/Apache OODT File Manager/React file manager.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..b162ca54b5175f545e6d964c9ad0ef56ec5c5dc9 GIT binary patch literal 105472 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 multiple value&descriptive information&AGGREGATION +See&Metadata&依赖 +See&more information&依赖 +its&location& +File Manager&what type&依赖 +File Manager&file urus generation scheme&依赖 +what type&file urus generation scheme&AGGREGATION +description&Product&AGGREGATION +element&form&依赖 +element&associated definition&依赖 +form&associated definition&AGGREGATION +element&additional metada&依赖 +A URI generation scheme&location&依赖 +A URI generation scheme&built&依赖 +A URI generation scheme&archive (&依赖 +Product&1 or more reference&依赖 +member&single Product Type&AGGREGATION +Product&single Product Type&依赖 +Product&mapping&依赖 +Product&Product Type&依赖 +mapping&Product Type&AGGREGATION +Product Type&associated Versioner&依赖 +relationship&below figure&依赖 +new&key capability&AGGREGATION +Easy management&different type&AGGREGATION +different type&Products&AGGREGATION +their&information& +their&ID& +Management&Product Types&AGGREGATION +Management&new type&依赖 +their&name& +Management&new type&依赖 +different kind&back end catalog&AGGREGATION +Catalog extension point&extension point&GENERALIZATION +Catalog extension point&product instance metada and file location information&依赖 +different type&back end data store&AGGREGATION +implementation&end database&依赖 +implementation&JDBC&依赖 +implementation&end database&依赖 +implementation&JDBC&依赖 +implementation&Catalog interface&AGGREGATION +Management&Product instance information&AGGREGATION +Management&include add , delete and update product instance information&依赖 +Management&file location&依赖 +It&Metadata and reference&依赖 +Manager&point& +different type&back end store&AGGREGATION +management&Element policy information&AGGREGATION +Element policy&instance&依赖 +Element policy&XML file&依赖 +Data Transfer&Transfer&GENERALIZATION +File Manager&different Data Transfer protocol&依赖 +Versioner extension point&different File Repository layout&依赖 +Versioner extension point&extension point&GENERALIZATION +Flat product&singular file&依赖 +collection&singular file&AGGREGATION +Products&directory&依赖 +collection&directory&AGGREGATION +File Manager&popular client-server paradigm&依赖 +File Manager&XML-RPC&依赖 +its&interface& +File Manager&File Manager client and server&依赖 +File Manager&main external interface&依赖 +little brother&SOAP&AGGREGATION +File Manager web interface&RSS-based syndication&依赖 +RSS-based syndication&Product feed&AGGREGATION +datum&status tracking&依赖 +RSS-feed&transfer&AGGREGATION +File Manager¤t Product and File transfer&依赖 +Extension Points We&file manager make use&依赖 +file manager make use&factory method pattern&AGGREGATION +interface&many implementation&依赖 +extension point&File Manager&依赖 +different implementation&interface&AGGREGATION +it&software component configuration&依赖 +it&different implementation&依赖 +it&interface&实现 +File Manager extension point&implementation&依赖 +File Manager extension point&two interface&实现 +implementation&two interface&AGGREGATION +File Manager extension point&extension factory&实现 +File Manager load&factory class&依赖 +File Manager load&factory class&依赖 +File Manager load&run-time&依赖 +File Manager load&run-time&依赖 +File Manager&example&依赖 +File Manager&database-based Catalog&依赖 +it&Lucene-based Catalog&依赖 +it&many different type&实现 +The Data Transfer extension point&Product&依赖 +The Data Transfer extension point&movement&依赖 +The Data Transfer extension point&archive&依赖 +movement&Product&AGGREGATION +Different protocol&local ( disk-based ) copy&依赖 +Different protocol&local ( disk-based ) copy&依赖 +extension point&Product Type&依赖 +extension point&element&依赖 +different URI generation scheme&file&依赖 +different URI generation scheme&final resting location&依赖 +final resting location&file&AGGREGATION +different URI generation scheme&particular Product&依赖 +definition&different URI generation scheme&AGGREGATION +Catalog Data Source&base catalog&依赖 +implementation&Catalog extension point interface&AGGREGATION +implementation&a jdbc accessible database backend&依赖 +lucene base catalog&lucene base catalog&依赖 +implementation&catalog extension point interface&AGGREGATION +implementation&catalog extension point interface&依赖 +lucene base catalog&Lucene free text index system&依赖 +implementation&catalog extension point interface&依赖 +implementation&Data Transfer interface&AGGREGATION +Apache&commons-io& +implementation&locally accessible network file system ( nfs ) disk&依赖 +implementation&XML-RPC File Manager client&依赖 +XML-RPC File Manager client&File Manager client&GENERALIZATION +implementation&XML-RPC File Manager client&依赖 +implementation&datum transfer interface&AGGREGATION +InPlace Data Transfer .&product&依赖 +implementation&product type policy information&依赖 +implementation&product type policy information&依赖 +implementation&repository manager extension point&AGGREGATION +implementation&JDBC accessible database&依赖 +implementation&JDBC accessible database&依赖 +XML file&file&GENERALIZATION +implementation&JDBC accessible database&依赖 +implementation&JDBC accessible database&依赖 +implementation&element policy information&依赖 +implementation&element policy information&依赖 +implementation&validation layer extension point&AGGREGATION +Validation Layer extension point&2 XML file&依赖 +implementation&) xml-rpc&依赖 +Validation Layer extension point&Element policy information&依赖 +implementation&( file manager client&依赖 +implementation&) xml-rpc&依赖 +implementation&Validation Layer extension point&AGGREGATION +implementation&( file manager client&依赖 +File Manager&transportation medium&依赖 +implementation&File Manager&依赖 +File Manager&use xml-rpc&依赖 +implementation&File Manager&依赖 +File Manager&use xml-rpc&依赖 +implementation&File Manager&依赖 +File Manager&transportation medium&依赖 +implementation&external server interface&AGGREGATION +XML-RPC&File Manager client&依赖 +implementation&client interface&AGGREGATION +implementation&XML-RPC File Manager server&依赖 +XML-RPC File Manager server&transportation medium&依赖 +implementation&XML-RPC File Manager server&依赖 +XML-RPC File Manager server&XML-RPC&依赖 +implementation&XML-RPC File Manager server&依赖 +several&above capability&AGGREGATION +we&that&依赖 +manager ingest use case red number&step&依赖 +manager ingest use case red number&step&依赖 +sequence&step&AGGREGATION +series&interaction&AGGREGATION +manager ingest use case red number&sequence&依赖 +manager ingest use case red number&sequence&依赖 +ingest operation&ingest&依赖 +File Manager client&Step 1&依赖 +ingest operation&a particular product&依赖 +File Manager client&ingest operation&依赖 +ingest operation&Metadata and References&依赖 +server&point& +System Interface&information&依赖 +it&path& +System Interface&made&依赖 +System Interface&Product Type policy&依赖 +Metadata&Catalog extension point&依赖 +System Interface&file reference&依赖 +Catalog extension point&catalog process&依赖 +Catalog extension point&Validation Layer&依赖 +its&Type& +first step&’s associated versioner&依赖 +Product&Versioner& +first step&’s associated versioner&依赖 +Data Transfer&client or server end&依赖 +aim&document&AGGREGATION +document&architecture&依赖 +document&constituent components , object model and key capability&依赖 +Manager&architecture& +its&model& +current implementation&extension point&AGGREGATION +overview¤t implementation&AGGREGATION +Manager&points& diff --git "a/src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt" "b/src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt" new file mode 100644 index 0000000..fbb01d6 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt" @@ -0,0 +1,100 @@ +Introduction +This is the developer guide for the Apache OODT Catalog and Archive Service (CAS) File Manager component, or File Manager for short. Primarily, this guide will explain the File Manager architecture and interfaces, including its tailorable extension points. For information on installation, configuration, and examples, please see our User Guides. + +The remainder of this guide is separated into the following sections: + +Project Description +Architecture +Extension Points +Current Extension Point Implementations +Project Description +The File Manager component is responsible for tracking, ingesting and moving file data and metadata between a client system and a server system. The File Manager is an extensible software component that provides an XML-RPC external interface, and a fully tailorable Java-based API for file management. + +Architecture +In this section, we will describe the architecture of the File Manager, including its constituent components, object model, and key capabilities. + +Components +The major components of the File Manager are the Client and Server, the Repository Manager, the Catalog, the Validation Layer, the Versioner, and the Transferer. The relationship between all of these components are shown in the diagram below: + +File Manager Architecture + +The File Manager Server contains both a Repository that manages products (and the products' location in the archive as specified by Versioner), and a Catalog that validates metadata via the Validation Layer. Transfer of data products from the Client to the Server is the domain of the Transfer and can be initiated at either the Client or the Server. + +Object Model +The critical objects managed by the File Manager include: + +Products - Collections of one or more files, and their associated Metadata. +Metadata - A map of key->multiple values of descriptive information about a Product. See CAS-Metadata for more information on Metadata. +Reference - A pointer to a Product file's (or files') original location, and to its final resting location within the archive constructed by the File Manager. +Product Type - Descriptive information about a Product that includes what type of file URI generation scheme to use, the root repository location for a particular Product, and a description of the Product. +Element - A singular Metadata element, such as "Author", or "Creator". Elements may have additional metadata, in the form of the associated definition and even a corresponding Dublin Core attribute. See CAS-Metadata for more information on Metadata Elements. +Versioner - A URI generation scheme for Product Types that defines the location within the archive (built by the File Manager) where a file belonging to a Product (that belongs to the associated Product Type) should be placed. +Each Product contains 1 or more References, and one Metadata object. Each Product is a member of a single Product Type. The Metadata collected for each Product is defined by a mapping of Product Type->1...* Elements. Each Product Type has an associated Versioner. These relationships are shown in the below figure. + +File Manager Object Model +Key Capabilities +The File manager has been designed with a new of key capabilities in mind. These capabilities include: + +Easy management of different types of Products. The Repository Manager extension point is responsible for managing Product Types, and their associated information. Management of Product Types includes adding new types, deleting and updating existing types, and retrieving Product Type Objects, by their ID or by their name. + +Support for different kinds of back end catalogs. The Catalog extension point allows Product instance metadata and file location information to be stored in different types of back end data stores quite easily. Existing implementations of the Catalog interface include a JDBC based back end database, along with a flat-file index powered by Lucene. + +Management of Product instance information. Management includes adding, deleting and updating product instance information, including file locations (References), along with Product Metadata. It also includes retrieving Metadata and References associated with existing Products as well as obtaining the Products themselves. + +Element management for Metadata. The File Manager's Validation Layer extension point allows for the management of Element policy information in different types of back end stores. For instance, Element policy could be stored in XML files, a Database, or a Metadata Registry. + +Data transfer mechanism interface. By having an extension point for Data Transfer, the File Manager can support different Data Transfer protocols, both local and remote. + +Advanced support for File Repository layouts. The Versioner extension point allows for different File Repository layouts based on Product Types. + +Support for multiple Product structures. The File Manager Client allows for Products to be Flat, or Hierarchical-based. Flat products are collections of singular files that are aggregated together to make a Product. Hierarchical Products are Products that contain collections of directories, and sub-directories, and files. + +Design for scalability. The File Manager uses the popular client-server paradigm, allowing new File Manager servers to be instantiated, as needed, without affecting the File Manager clients, and vice-versa. + +Standard communication protocols. The File Manager uses XML-RPC as its main external interface between the File Manager client and server. XML-RPC, the little brother of SOAP, is fast, extensible, and uses the underlying HTTP protocol for data transfer. + +RSS-based Product syndication. The File Manager web interface allows for the RSS-based syndication of Product feeds based on Product Type. + +Data transfer status tracking. The File Manager tracks all current Product and File transfers and even publishes an RSS-feed of existing transfers. + +This capability set is not exhaustive, and is meant to give the user a feel for what general features are provided by the File Manager. Most likely the user will find that the File Manager provides many other capabilities besides those described here. + +Extension Points +We have constructed the File Manager making use of the factory method pattern to provide multiple extension points for the File Manager. An extension point is an interface within the File Manager that can have many implementations. This is particularly useful when it comes to software component configuration because it allows different implementations of an existing interface to be selected at deployment time. + +The factory method pattern is a creational pattern common to object oriented design. Each File Manager extension point involves the implementation of two interfaces: an extension factory and an extension implementation. At run-time, the File Manager loads a properties file specifies a factory class to use during extension point instantiation. For example, the File Manager may communicate with a database-based Catalog and an XML-based Element Store (called a Validation Layer), or it may use a Lucene-based Catalog and a database-based Validation Layer. +Using extension points, it is fairly simple to support many different types of what are typically referred to as "plug-in architectures." Each of the core extension points for the File Manager is described below: + +Catalog The Catalog extension point is responsible for storing all the instance data for Products, Metadata, and for file References. Additionally, the Catalog provides a query capability for Products. +Data Transfer The Data Transfer extension point allows for the movement of a Product to and from the archive managed by the File Manager component. Different protocols for Data Transfer may include local (disk-based) copy, or remote XML-RPC based transfer across networked machines. +Repository Manager The Repository Manager extension point provides a means for managing all of the policy information (i.e., the Product Types and their associated information) for Products managed by the File Manager. +Validation Layer The Validation Layer extension point allows for the querying of element definitions associated with a particular Product Type. The extension point also maps Product Type to Elements. +Versioning The Versioning extension point allows for the definition of different URI generation schemes that define the final resting location of files for a particular Product. +System The extension point that provides the external interface to the File Manager services. This includes the File Manager server interface, as well as the associated File Manager client interface, that communicates with the server. +Current Extension Point Implementations +There are at least two implementations of all of the aforementioned extension points for the File Manager. Each extension point implementation is detailed in this section. + +Catalog +Data Source based Catalog. An implementation of the Catalog extension point interface that uses a JDBC accessible database backend. +Lucene based Catalog. An implementation of the Catalog extension point interface that uses the Lucene free text index system to store Product instance information. +Data Transfer +Local Data Transfer. An implementation of the Data Transfer interface that uses Apache's commons-io to perform local, disk based filesystem data transfer. This implementation also supports locally accessible Network File System (NFS) disks. +Remote Data Transfer. An implementation of the Data Transfer interface that uses the XML-RPC File Manager client to transfer files to a remote XML-RPC File Manager server. +InPlace Data Transfer. An implementation of the Data Transfer interface that avoids transfering any products -- this can be used in the situation where metadata about a particular product should be recorded, but no physical transfer needs to occur. +Repository Manager +Data Source based Repository Manager. An implementation of the Repository Manager extension point that stores Product Type policy information in a JDBC accessible database. +XML based Repository Manager. An implementation of the Repository Manager extension point that stores Product Type policy information in an XML file called product-types.xml +Validation Layer +Data Source based Validation Layer. An implementation of the Validation Layer extension point that stores Element policy information in a JDBC accessible database. +XML based Validation Layer. An implementation of the Validation Layer extension point that stores Element policy information in 2 XML files called elements.xml and product-type-element-map.xml +System (File Manager client and File Manager server) +XML-RPC based File Manager server. An implementation of the external server interface for the File Manager that uses XML-RPC as the transportation medium. +XML-RPC based File Manager client. An implementation of the client interface for the XML-RPC File Manager server that uses XML-RPC as the transportation medium. +Use Cases +The File Manager was built to support several of the above capabilities outlined in Section 3. In particular there were several use cases that we wanted to support, some of which are described below. + +File Manager Ingest Use Case +The red numbers in the above Figure correspond to a sequence of steps that occurs and a series of interactions between the different File Manager extension points in order to perform the file ingestion activity. In Step 1, a File Manager client is invoked for the ingest operation, which sends Metadata and References for a particular Product to ingest to the File Manager server’s System Interface extension point. The System Interface uses the information about Product Type policy made available by the Repository Manager in order to understand whether or not the product should be transferred, where it’s root repository path should be, and so on. The System Interface then catalogs the file References and Metadata using the Catalog extension point. During this catalog process, the Catalog extension point uses the Validation Layer to determine which Elements should be extracted for the particular Product, based upon its Product Type. After that, Data Transfer is initiated either at the client or server end, and the first step to Data Transfer is using the Product’s associated Versioner to generate final file References. After final file References have been determined, the file data is transferred by the server or by the client, using the Data Transfer extension point. + +Conclusion +The aim of this document is to provide information relevant to developers about the CAS File Manager. Specifically, this document has described the File Manager's architecture, including its constituent components, object model and key capabilities. Additionally, the this document provides an overview of the current implementations of the File Manager's extension points. \ No newline at end of file diff --git "a/src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt.xml.xls" "b/src/main/resources/sdtocode/doc/Apache OODT File Manager/cas-filemgr \342\200\223 CAS File Manager Developer Guide.txt.xml.xls" new file mode 100644 index 0000000000000000000000000000000000000000..47ee0175b2b0f2f838986e32b86fae0973f3d173 GIT binary patch literal 32256 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®#{@OT0?wO1$U6?~3rUQ26e9 zZoYLgztb&5zX^zcJsmy0z!ofmw2nHSim}G8D%?kU*oY)h?JtI_H+T;;Y~syDOT?`A zJnm=UzAaqrTin;2xH*$3`?#(gAPjTN2i}MM3e-rmh z!P*mX{CnIt0{mUDF2KDVjA3|s{t)**+-HID4eod1J`?V<5me~tSM zxOajz15?xh#;-X=aK`L ziGIB3_m=Nxh-Mw?#9w>jV=9;}?`J4^We6sQ9})A;l-g&>_uIXZ=&68<|229O8YaMx z`1Ko{{iAz>cLYj6ZNyUHD;fcN*`yJR#5?+suLfUqL<~*oXn$Gc7Tp{rt86F2k5wV>3VSG0Xn$z03BRJcl zjOY=m0TDz0i=;-0pIF)m5`8Wz8v=>m7D+=P(a$1jV@UL{NE!x-zD0>_c)3dKkNy;u zu|IlJB(XpGOC+&BdK4u_gD)R>jwDj(F_AdIk94!m#zLS+MG^`0rAXpv=tYr~w1aD8DZ?DfFc}Rai*^iCJBEoJ z^g!~suD*PXJd!vc^two*9f3-;V-J;*cF-RzWmB;urfe#9U_%k+reX)S6C))l^dn25 z=UE@22l?``c8-SL5cvq#$<8Xh%@Q_q?AS~Qf$4cOA?&GA(hhpCrEKm{xJUWeLn8Y( z7s_5LB`M62ma>IV0#lRwo$rl-#L;Y_quIh)8^(w4jWuny6v8-_NEojY=VNb`l6Ekz zEQPtk_hJh7+Q<&BH*gd znoUi96yBFVejsHV8O<~;OWMMn$5Qw~XqyYS70PteZd;+WsFb8I!&u68LYZM|ZYPxe zAaQ25)0y4Q@p|rTmax4un(c)!)9|(z!u~2H?O^`06g>@1XdsKNEwS=VQ0A;dYBx!V$UaR|FOcI+aA`Noc296Ly} zlwF0gz|`DTDYRo(wPRPu4xTV9VK>K)-IPGD-%SVy8~SdJ9n9;Nvb#gs-J$F*lr}@z zT`6C9bG`Wp#ZqIhHy|lg zbUo($w2t{atz-61>zIAhI_A=}j`=*T<8xJ7H!(xU%$lyZZ-$OpHeIhNLpM1?$K0B3 z%PgAKF^i;i%&2J{vt?SxoSD`!JEnEak!c;XURuZ8m)0?_rFG11X&p0HQpZRMptI2s zIMEO|(GW;99D@2$yJV)K$NJtvQ?`dt7OBL1cPJ#r_8uDBdpNO8|F#4^w84bR-#IzYDgu_)Lq1_NhDPfdj17pV$Mhl_C5Jrm)OATSP5=J`& zMw*YO?`V$p6vB}z#iQW-?J0z#v@AKBj7>|~%c1Ngb{uWm?Io0BR7z49&AxZ6DH|gc zp2*ny7@@@b@)#Y>7-vQq`@VOaX){&`q>?aJ2*<0$UF-yvl6Ej#SjsquGEOKzHSNZU z9m`ZoQkY*XWxP=0-uX_&_ei0Kjn~nPch-j4$P)Gz!gA<18orP5@t!jx?5%{o9RhQg zk3Ub2+Ds5aUL_I=DsetSm69W2wzHIp4rQX)(Pi3A6gyU^l%y~}TFO2`iF@BiDV&de zbTs=oqhU6+gnb=5_7y_6>3Lrv6je&v!TjrcD^1xXp{!Dgb3!lU98VHTNu?x(8QW5t z97>be(qq~+38k!3lENHsDU%(_WT8|{yU9Z7RVhi~uHbtonzAWEp=WRmQ-o4giK`r+ zt*6NBZf453kN9{~9<^&0N?j$+OCKbzPqWxUdb6`W+;uErs$<7gv4aG*n<|8Um6D^O zb-uUSludIe(}c1{%Q%{~DkUl0*(_zcLzym=lT5qmV#~=YB`MqsEu}>$aqlfk;hePS zoU}M|!kyFiPBHWuLWp~wA%s)4jH5YCrKBD7NZ&i%lJ1Ca~~)+ zTxbXfD&asS@GLz9K~rkv89DmTo|h?G$)29AE^foK^lbE#Jl{~)nxQ)=LpLWwH#b8! zFGDv!L$@G9cW{QTEknmMR(c!@Gju#*rR(vWmDX`R(>k7}(z+!XI-a1?^>~g->v&E| z>v&p9>v%Rw>v%#+>v%Fs>v-x(>v;A_>yFLP@f4G;$MZv4$1_Y?$CE``$5TpD$B3H^ zosERq5=$3B7nL!VE{4R6Fk2&GwiAu?R!eAg2(1!Jml$5F5H3|InVIO{mU562)BML2 zeD5;UpdAOP9S3Pd(ppA?CCqW`nB&+nM+lc2JLU)_-UAswzITNwn=6znRiYhNL82XV z)ed9>=yx@>7;V0HwMxt_*Qi9owU9`dr-XSzxX#pKY+Ay6u^}eRmyukrHJPPvP$@a1 zjAlz&Ae1=IE)dF%s6jgxs2vNOkudgs?r7UzP3msb)3gu2iS?Exh!z^Wy zLs=x0yHJBOyGUntku$T*c)oYHp&u%QIO+}+!aas?s1go!2+WVZcdsEF<`51O!hKrC zwTZp`FlQvpsFt$Wp)3~4{f4qw?07(>7~Qt`hy^A(d#$!zv{y%-X*9 zh$%Z+^~&Q*zayrmNDcw42U9o+RT z#7o(x?%Ls!Yr^=9Z!%+OUcbhQj!Jww-* zq3h4ktFo)UQP%ftCWmN`nRQYI+RYK{K~ZJ6v`(mB`J&u-}}^* z<%RN@N*vASkT{yWjwbKq7{-r}2#;ofp8@l|FI6JpE0vfX;@n@*?7*30#92xxl(=0e zqxl*&Xh*1agpM7IPv85-^wlMVZ&jil->F19eyvh+J{Zxy_h+VTg;0K@5-Ds)J65P2 zD;zr*|CZ1#ggEDR%Se7}c-=zyok~eNm@$0s&rMlTDF03++VK}EaWwy4r6h$p#!^-a zC2qG;Z21qU!O^VL(X4bv!;Iv6e`)Begh2o1nynJTe^iNf(C(-#X$NzdrIduiy__{m zLWyUnBzF9jmL)07dcOCcOj(am{o8$wy^_%AAPG=Hs9 z(vFHlsW_C1P-3epV#j|ql#1AbZBWL|JZx?0btt_;iRYRBxS{X;jkZhL!p!Y^e{0H4 z6v}^7iF0zZN~HXqN=XWHy`@wgN>yz6d(*Bew)}%iNeXudOQ{JZ?!BfIdRtA`r{=5= z_YzB}J9gBC@QvGjtba z=q}FCU6P@@G(&e;hVJqV-4z+SD>HOgW$3QX&|Q zvva8s_BMT8>e#_tY$=yHqq$5d{F^0GE)&W`m6CJ9>}@HRJGNZz*mAj09z%UHFL!KV zzW2R-Ob=H$lq-a?FUmM4SLmEv;miql2TQn82$Kx&N+C2E!j($6QV7G1Mchm9xo*?u zD#wPagfKebGCaKEyYYlITFyGAI}LE(H{ zqocV-2;9Lqzs#eSaIIsOv3ZcbVb**CuX_j)GL%B{UGmIVAsU6n|An zY(u%xnG^2mmU5Fr;Xiqg&uO9^*XAajlbf75VeYbon;pWoyMd0*tda~J{R4dp}QkP$5TqW?OhqVyEAn6Wa#eA(A}4zyFWwsK!)zY z4BgK&bPr|d9?sA`lA(JvL&t2Jo|nfnbWddHp3Klam7#k&L-$OE?%50-JuPkD^BKAq zGITFy=zfu*dnrTra!N;UzYRLyn{OiFHYc8LbK>bXiG&4OGZ~fiSWCIxq1^6JZWqeI zhH|?TmGp5-xx=B{A(S@L?hc_GqEgZpMunx^=}_);D0d2Fp`qOA*uprnl)D_tT|!xe zcFcEo359ccmk{DTfKi9fmK*xrLO4t%X3WJZF?%mjDLER(sioZG*l~~8aky!BkJ!AvTkaJK{hnjES128Za<4Nd%mtQmpJU5?LRo6s-6xbIR7%>y>|rVQJCysK z5#2A8BMs$##}?)rOL@SdJRlU#HP`0>p>S*uIP1ggWC;&Cga@6`JSc>tj2#a;b}*m$ z-qEJ)=Rz3+9sB#aP>#_uuJW-eCFg`0&{7_9Y$Ql4;Zc|s^Tw4=v8AryMR z6GDhH0%HuHYB%&Jh42A%tofu6c)pD!`bzv<_@rY8cOyLAo0?BKc047Ng0bT%wc{zr z4(?r+@U%mCS_q+`KP`kVm6CqK-Of^;5lYL@|{gsgDCoc$v>-~ZdVn5*??|Z9En-_(!J9Mo1qS#T=GWto6O3C%%slfNj zrtB9&si;IddQ~FjM3s^ho+B*fC5Q5o*b-A-lF?KR=k4T4JL~627oWq^HTW)jJuFF|yWrpsx4BhJ)x;HX(Z)WJ; z%Fw-?p?fDo_il!co}M1>`x!dMN4nmJ8M==$bRTEvewCqP21xhuX@>5z4Bh7$x-T+x zUuNjO%FunCq5CF7_icvmyOfS`xgI*};p@f2>&C;^i--3?qKB_n4_~hyP6EBq5?*m4 z?G+)!5%Y==`VIXRC(`J*mh!4YdDWr3DwNfR@~T6jr~BR-Q}#=ttW}A*<0O@sJ5E+9 znL8L8mhzfV;vMcavE>xg?lrOHRF#qxMw6wy?%49WP);-LUKh&gDkUk5KTCPTvE>b+ z#N&HIDC-R64QE~$v6k|tW6PUD`I%|=rclmMDQOF1+)~~W%9*C-TSDQvhraTbQ0N_R zi5>AI~+VOI0K3r*SkLRoA^ z^S)5{evxzXzECdGnn?=tprw4^*z$o;E;j8x5XvPgB`M6DzIUl9`%oxx?;i@~GA(2L zT&_}*!dz=9A32ndgfiWX=p(TuUgeLRRc3a!l#hk7rD^xEP_97lT;-32!WsJ5S!L#O z-@DS-_$wh?r4qgEYLz&eYg9^(hS}dzJ`qaJ*zt+jaV^@>j!)E%PaHeAS6ITQjvb#0 zA-3aFA;c^EsWTtkT`c7@q431TaepS1>x})M3FUf~lB3~%gulozWuFV>MwK`xH$mcP zKG)HFE_TGHJnmljT#jk;g%H?=c6=dr1jec_gm8s&!~|;{#(HV8n^bI-WZ*LWxsZXRU1VjMj&74=l`Ss Hi~0WoDmUhI literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW-relation.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW-relation.txt new file mode 100644 index 0000000..92b130e --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW-relation.txt @@ -0,0 +1,111 @@ +we&version 0.21&依赖 +we&version 0.21&依赖 +we&hdf&依赖 +modular structure&hdf and version 0.21&AGGREGATION +we&modular structure&依赖 +we&modular structure&依赖 +we&hdf&依赖 +static analysis&source code&AGGREGATION +class and group&class ( module )&AGGREGATION +structure&figure&依赖 +[ module view&] 1.1 Modularity risk&依赖 +[ module view&] 1.1 Modularity risk&依赖 +[ module view&] 1.1 Modularity risk&依赖 +[ module view&] 1.1 Modularity risk&依赖 +[ module view&time&依赖 +it&structure& +[ module view&] 1.1 Modularity risk&依赖 +[ module view&software&依赖 +[ module view&time&依赖 +[ module view&time&依赖 +[ module view&software&依赖 +[ module view&time&依赖 +development&software&AGGREGATION +[ module view&] 1.1 Modularity risk&依赖 +[ module view&software&依赖 +[ module view&software&依赖 +[ module view&] 1.1 Modularity risk&依赖 +[ module view&] 1.1 Modularity risk&依赖 +section&characteristic&依赖 +section&four signal&依赖 +section&code&依赖 +characteristic&code&AGGREGATION +part&package&AGGREGATION +class or group&class&AGGREGATION +its&own& +class or group&more dependency ( incoming or outgoing )&依赖 +they&code&依赖 +module structure&structure&GENERALIZATION +signal&module structure&依赖 +package hdf&two&依赖 +hdfs package&code&依赖 +hdfs package&package&GENERALIZATION +hdfs.common package&package&GENERALIZATION +default port number&server.namenode and server.datanode package&依赖 +NameNode and DataNode&default port number&依赖 +server&package&依赖 +server&package& +hdfs.common instead&namenode or datanode server&依赖 +server&dependency&依赖 +1.1.1.2 hfds.security security.token.delegation.DelegationTokenSecretManager&server.namenode.FSNameSystem&依赖 +security code&code&GENERALIZATION +security code&namenode&依赖 +security code&other server&依赖 +1.1.1.3 hdfs.protocol The class blocklistaslong&server.datanode module&依赖 +1.1.1.3 hdfs.protocol The class blocklistaslong&ReplicaInfo&依赖 +hdfs.protocol&server&依赖 +1.1.1.4 hdfs.server.protocol&server.common&依赖 +protocol&defined constant&依赖 +1.1.1.4 hdfs.server.protocol&two class&依赖 +1.1.1.4 hdfs.server.protocol&two class&依赖 +1.1.1.4 hdfs.server.protocol&server.common&依赖 +they&communication&依赖 +they&communication&依赖 +they&server&依赖 +they&server&依赖 +their&use& +hdfs.server.protocol&protocol message&依赖 +its&messages& +hdfs.server.protocol&code&依赖 +hdfs.server.protocol&class&依赖 +It&protocol&依赖 +It&class&依赖 +It&dependency&依赖 +1.1.1.5 server.common IncorrectVersionException and InconsistentFSStateException&server.protocol&依赖 +function ( jsphelper.sortnodelist )&relevant&依赖 +namenode package&package&GENERALIZATION +function ( jsphelper.sortnodelist )&it&依赖 +JspHelper&namenode&依赖 +it&other server&依赖 +function ( jsphelper.sortnodelist )&namenode package&依赖 +1.1.1.6 hdfs.server.namenode server.namenode&servlet&依赖 +class namenode.FSNameSystem&multiple cyclic dependency&依赖 +It&namenode.NameNode , namenode.FSNameSystemMetrics and namenode.LeaseManager&依赖 +It&direct cyclic dependency&依赖 +1.1.1.7 hdfs.server.datanode server.datanode&hdfs.DFSClient&依赖 +1.1.1.8 hdfs.server.balancer server.balancer&hdfs.DFSClient&依赖 +possibility&dependency&依赖 +possibility&dependency&依赖 +balancer&namenode&依赖 +namenode.UnsupportedActionException&namenode and balancer namenode.Namenode&依赖 +it&port number&依赖 +namenode.UnsupportedActionException&it&依赖 +namenode&number& +block placement policy&balancer&AGGREGATION +policy&namenode&AGGREGATION +block placement policy&policy&依赖 +block placement policy&namenode&依赖 +check&protocol message&依赖 +check&server.protcol&依赖 +class server.balancer.Balancer&several cyclic dependency&依赖 +they&same source file&依赖 +dependency structure&class&AGGREGATION +effect&dependency&AGGREGATION +different component&them&依赖 +1.1.1.9 hdfs.tools tool&different component&依赖 +couple&different component&AGGREGATION +1.1.1.9 hdfs.tools tool&couple&依赖 +different component&low coupling&依赖 +main domain&a filesystem ( debugging&AGGREGATION +it&sense&依赖 +user&convenience& diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt new file mode 100644 index 0000000..4af331b --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt @@ -0,0 +1,75 @@ +HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW + + + +1 Module View +In this section we describe the modular structure of the HDFS, version 0.21. + +This structure is derived from a static analysis of the source code, specifically focusing on the dependencies between classes and groups of classes (modules). This structure is shown in the figure below. +[Module view] +1.1 Modularity Risks +With development of the software over time, all source code inevitably drifts away from it’s initial "as-designed" structure. This section identifies four signals--characteristics of the code--that suggest that the source code has evolved to a less modular structure: + +Module with a very weak dependency on another module: If a dependency from one module to another is very weak, it could indicate that the dependency is not well thought-out, but rather a technical debt incurred by a short-term expediency to easily implement a feature or fix a bug rather than adhering strictly to a principled architecture. +Module within a module: If a part of a package only depends on itself, and has no incoming dependencies from other classes in the package, this suggests that it is really a separate module. +Class(es) with more connections to another module than to its own: If a class or group of classes in a module has more dependencies (incoming or outgoing) to classes in another module than its own, this could be a sign that the class or group of classes could perhaps better be located in the other module, or perhaps in a separate, shared module. +Cyclic dependencies: A cyclic dependency occurs when two or more classes depend on each other either directly or indirectly. We consider cyclic dependencies a signal for refactoring opportunities, because they make it harder to understand, reuse and test the code. +When these signals are applied to the module structure, it appears that the HDFS could be made more modular. Each of these refactoring opportunities is now discussed, presented per module. + +1.1.1.1 hdfs +Because the hdfs package now contains code that is used by both the client and the server, the package hdfs should be split into two: hdfs.client and hdfs.common. The hdfs.common package can contain all code that is shared by both the client and server modules, while the client would contain just the code necessary for the client. This division could look as follows: + +hdfs.client + +hdfs.common + +BlockMissingException.java +DFSClient.java +DFSInputStream.java +DFSOutputStream.java +ByteRangeInputStream.java +DFSClient.java +HftpFileSystem.java +HsftpFileSystem.java + +BlockReader.java +DeprecatedUTF8.java +DFSConfigKeys.java +DFSUtil.java +DistributedFileSystem.java +HdfsConfiguration.java +HDFSPolicyProvider.java + + + + +Currently, the default port numbers that the NameNode and DataNode run with are stored in the server.namenode and server.datanode packages respectively. If they would be stored in hdfs.common instead, servers that want to communicate with either the namenode or datanode server would not need a dependency on that server's package. + +1.1.1.2 hfds.security +security.token.delegation.DelegationTokenSecretManager depends on server.namenode.FSNameSystem, while the security code is used by other servers than the namenode. This could be refactored so that FSNameSystem is called from the namenode rather than the security module, removing a dependency. + +1.1.1.3 hdfs.protocol +The class BlockListAsLongs depends on ReplicaInfo in the server.datanode module, which looks like an unhealthy dependency, given that hdfs.protocol is used by all servers rather than just the datanode server. Building the block list is a task that is better performed in the hdfs.server.datanode module. + +1.1.1.4 hdfs.server.protocol +The server.protocol package depends on two classes in server.common that protocol just uses for defined constants. It seems that it would be better to store these constants in the server.protocol package, as they (proven by their use in server.protocol) define the communication between servers. There are also dependencies from hdfs.server.protocol to hdfs.server.datanode (in protocol.DataNodeRegistration) and hdfs.server.namenode (in protocol.CheckpointCommand). These dependencies exist because hdfs.server.protocol contains code to fill its protocol messages from these classes. It would remove the dependencies from protocol on these classes if datanode and namenode themselves would be responsible for filling in the protocol messages. + +1.1.1.5 server.common +IncorrectVersionException and InconsistentFSStateException would probably fit better in server.protocol. JspHelper depends on namenode; the function that uses it (JspHelper.sortNodeList) can be moved to the namenode package, since it's not relevant for other servers. + +1.1.1.6 hdfs.server.namenode +server.namenode depends on hdfs.DFSClient to create servlets. It appears that this code could be refactored to be put into hdfs.common. The class namenode.FSNameSystem is involved in multiple cyclic dependencies. It has a direct cyclic dependency with namenode.NameNode, namenode.FSNameSystemMetrics and namenode.LeaseManager, and there are indirect cyclic dependencies on more classes (for example UpgradeObjectNamenode, UpgradeManagerNamenode. + +1.1.1.7 hdfs.server.datanode +server.datanode also depends on hdfs.DFSClient. Putting this code in common would be a good refactoring opportunity. + +1.1.1.8 hdfs.server.balancer +server.balancer also depends on hdfs.DFSClient, again input from the community is greatly appreciated on if putting this code in common would be a good refactoring opportunity. Another refactoring possibility for the balancer is to remove the dependency on the namenode. The classes from namenode that the balancer depends on are: + +namenode.UnsupportedActionException, which could be moved to protocol, since it's a shared message between namenode and balancer +namenode.Namenode, on which it only depends to get the namenode's port number, which could be stored in the common package. +namenode.BlockPlacementPolicy, on which it depends to check if the block placement policy of the balancer matches the policy of the namenode. This check could be done through a protocol message in server.protcol as well. +Removing the dependency on namenode would make balancer a fully separate server, and would allow it to perform at the same level as datanode and namenode. The class server.balancer.Balancer contains several cyclic dependencies, however, they are all within classes in the same source file. This means the effect of the dependencies is likely less severe, but refactoring the dependency structure of this class could still be an opportunity to increase modularity. + +1.1.1.9 hdfs.tools +tools consists of a couple of different components that have low coupling between them. But because they all provide functionality that falls somewhat outside the main domain of a filesystem (debugging and administrative tools), it makes sense to keep them together in one package for the user's convenience. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP DISTRIBUTED FILE SYSTEM (HDFS) ARCHITECTURAL DOCUMENTATION - MODULE VIEW.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..81287be724e8c0cc41ffbf463f512afff968fb9a GIT binary patch literal 18432 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 O`)mJyX!xJ)@xKAgqD Hadoop Distributed File System + YARN -> Yet Another Resource Negotiator + MapReduce -> Data processing using programming + Spark -> In-memory Data Processing + PIG, HIVE-> Data Processing Services using Query (SQL-like) + HBase -> NoSQL Database + Mahout, Spark MLlib -> Machine Learning + Apache Drill -> SQL on Hadoop + Zookeeper -> Managing Cluster + Oozie -> Job Scheduling + Flume, Sqoop -> Data Ingesting Services + Solr& Lucene -> Searching & Indexing + Ambari -> Provision, Monitor and Maintain cluster +HDFS + Hadoop Distributed File System is the core component or you can say, the backbone of Hadoop Ecosystem. + HDFS is the one, which makes it possible to store different types of large data sets (i.e. structured, unstructured and semi structured data). + HDFS creates a level of abstraction over the resources, from where we can see the whole HDFS as a single unit. + It helps us in storing our data across various nodes and maintaining the log file about the stored data (metadata). + HDFS has two core components, i.e. NameNode and DataNode. +1. The NameNode is the main node and it doesn’t store the actual data. It contains metadata, just like a log file or you can say as a table of content. Therefore, it requires less storage and high computational resources. +2. On the other hand, all your data is stored on the DataNodes and hence it requires more storage resources. These DataNodes are commodity hardware (like your laptops and desktops) in the distributed environment. That’s the reason, why Hadoop solutions are very cost effective. +3. You always communicate to the NameNode while writing the data. Then, it internally sends a request to the client to store and replicate data on various DataNodes. +YARN +Consider YARN as the brain of your Hadoop Ecosystem. It performs all your processing activities by allocating resources and scheduling tasks. + It has two major components, i.e. Resource Manager and Node Manager. +1. Resource Manager is again a main node in the processing department. +2. It receives the processing requests, and then passes the parts of requests to corresponding Node Managers accordingly, where the actual processing takes place. +3. Node Managers are installed on every Data Node. It is responsible for execution of task on every single Data Node. + +1. Schedulers: Based on your application resource requirements, Schedulers perform scheduling algorithms and allocates the resources. +2. Applications Manager: While Applications Manager accepts the job submission, negotiates to containers (i.e. the Data node environment where process executes) for executing the application specific Application Master and monitoring the progress. ApplicationMasters are the deamons which reside on DataNode and communicates to containers for execution of tasks on each DataNode. +3. ResourceManager has two components: Schedulers and application manager +MAPREDUCE +It is the core component of processing in a Hadoop Ecosystem as it provides the logic of processing. In other words, MapReduce is a software framework which helps in writing applications that processes large data sets using distributed and parallel algorithms inside Hadoop environment. + In a MapReduce program, Map() and Reduce() are two functions. +1. The Map function performs actions like filtering, grouping and sorting. +2. While Reduce function aggregates and summarizes the result produced by map function. +3. The result generated by the Map function is a key value pair (K, V) which acts as the input for Reduce function. +Let us take the above example to have a better understanding of a MapReduce program. We have a sample case of students and their respective departments. We want to calculate the number of students in each department. Initially, Map program will execute and calculate the students appearing in each department, producing the key value pair as mentioned above. This key value pair is the input to the Reduce function. The Reduce function will then aggregate each department and calculate the total number of students in each department and produce the given result. +APACHE PIG + PIG has two parts: Pig Latin, the language and the pig runtime, for the execution environment. You can better understand it as Java and JVM. + It supports pig latin language, which has SQL like command structure. +10 line of pig latin = approx. 200 lines of Map-Reduce Java code But don’t be shocked when I say that at the back end of Pig job, a map-reduce job executes. + The compiler internally converts pig latin to MapReduce. It produces a sequential set of MapReduce jobs, and that’s an abstraction (which works like black box). + PIG was initially developed by Yahoo. + It gives you a platform for building data flow for ETL (Extract, Transform and Load), processing and analyzing huge data sets. +How Pig works? In PIG, first the load command, loads the data. Then we perform various functions on it like grouping, filtering, joining, sorting, etc. At last, either you can dump the data on the screen or you can store the result back in HDFS. +APACHE HIVE + Facebook created HIVE for people who are fluent with SQL. Thus, HIVE makes them feel at home while working in a Hadoop Ecosystem. + Basically, HIVE is a data warehousing component which performs reading, writing and managing large data sets in a distributed environment using SQL-like interface. +HIVE + SQL = HQL + The query language of Hive is called Hive Query Language(HQL), which is very similar like SQL. + It has 2 basic components: Hive Command Line and JDBC/ODBC driver. + The Hive Command line interface is used to execute HQL commands. + While, Java Database Connectivity (JDBC) and Object Database Connectivity (ODBC) is used to establish connection from data storage. + Secondly, Hive is highly scalable. As, it can serve both the purposes, i.e. large data set processing (i.e. Batch query processing) and real time processing (i.e. Interactive query processing). + It supports all primitive data types of SQL. + You can use predefined functions, or write tailored user defined functions (UDF) also to accomplish your specific needs. +APACHE MAHOUT +Now, let us talk about Mahout which is renowned for machine learning. Mahout provides an environment for creating machine learning applications which are scalable. Machine learning algorithms allow us to build self-learning machines that evolve by itself without being explicitly programmed. Based on user behaviour, data patterns and past experiences it makes important future decisions. You can call it a descendant of Artificial Intelligence (AI). What Mahout does? It performs collaborative filtering, clustering and classification. Some people also consider frequent item set missing as Mahout’s function. Let us understand them individually: +1. Collaborative filtering: Mahout mines user behaviors, their patterns and their characteristics and based on that it predicts and make recommendations to the users. The typical use case is E-commerce website. +2. Clustering: It organizes a similar group of data together like articles can contain blogs, news, research papers etc. +3. Classification: It means classifying and categorizing data into various sub-departments like articles can be categorized into blogs, news, essay, research papers and other categories. +4. Frequent item set missing: Here Mahout checks, which objects are likely to be appearing together and make suggestions, if they are missing. For example, cell phone and cover are brought together in general. So, if you search for a cell phone, it will also recommend you the cover and cases. +Mahout provides a command line to invoke various algorithms. It has a predefined set of library which already contains different inbuilt algorithms for different use cases. +APACHE SPARK + Apache Spark is a framework for real time data analytics in a distributed computing environment. + The Spark is written in Scala and was originally developed at the University of California, Berkeley. + It executes in-memory computations to increase speed of data processing over Map-Reduce. + It is 100x faster than Hadoop for large scale data processing by exploiting in-memory computations and other optimizations. Therefore, it requires high processing power than Map-Reduce. +As you can see, Spark comes packed with high-level libraries, including support for R, SQL, Python, Scala, Java etc. These standard libraries increase the seamless integrations in complex workflow. Over this, it also allows various sets of services to integrate with it like MLlib, GraphX, SQL + Data Frames, Streaming services etc. to increase its capabilities. . Apache Spark best fits for real time processing, whereas Hadoop was designed to store unstructured data and execute batch processing over it. When we combine, Apache Spark’s ability, i.e. high processing speed, advance analytics and multiple integration support with Hadoop’s low cost operation on commodity hardware, it gives the best results. +That is the reason why, Spark and Hadoop are used together by many companies for processing and analyzing their Big Data stored in HDFS. +APACHE HBASE + HBase is an open source, non-relational distributed database. In other words, it is a NoSQL database. + It supports all types of data and that is why, it’s capable of handling anything and everything inside a Hadoop ecosystem. + It is modelled after Google’s BigTable, which is a distributed storage system designed to cope up with large data sets. + The HBase was designed to run on top of HDFS and provides BigTable like capabilities. + It gives us a fault tolerant way of storing sparse data, which is common in most Big Data use cases. + The HBase is written in Java, whereas HBase applications can be written in REST, Avro and Thrift APIs. +For better understanding, let us take an example. You have billions of customer emails and you need to find out the number of customers who has used the word complaint in their emails. The request needs to be processed quickly (i.e. at real time). So, here we are handling a large data set while retrieving a small amount of data. For solving these kind of problems, HBase was designed. +APACHE DRILL +Apache Drill is used to drill into any kind of data. It’s an open source application which works with distributed environment to analyze large data sets. + It is a replica of Google Dremel. + It supports different kinds NoSQL databases and file systems, which is a powerful feature of Drill. For example: Azure Blob Storage, Google Cloud Storage, HBase, MongoDB, MapR-DB HDFS, MapR-FS, Amazon S3, Swift, NAS and local files. +So, basically the main aim behind Apache Drill is to provide scalability so that we can process petabytes and exabytes of data efficiently (or you can say in minutes). + The main power of Apache Drill lies in combining a variety of data stores just by using a single query. + Apache Drill basically follows the ANSI SQL. + It has a powerful scalability factor in supporting millions of users and serve their query requests over large scale data. +APACHE ZOOKEEPER + Apache Zookeeper is the coordinator of any Hadoop job which includes a combination of various services in a Hadoop Ecosystem. + Apache Zookeeper coordinates with various services in a distributed environment. +Before Zookeeper, it was very difficult and time consuming to coordinate between different services in Hadoop Ecosystem. The services earlier had many problems with interactions like common configuration while synchronizing data. Even if the services are configured, changes in the configurations of the services make it complex and difficult to handle. The grouping and naming was also a time-consuming factor. Due to the above problems, Zookeeper was introduced. It saves a lot of time by performing synchronization, configuration maintenance, grouping and naming. +Although it’s a simple service, it can be used to build powerful solutions. +APACHE OOZIE +Consider Apache Oozie as a clock and alarm service inside Hadoop Ecosystem. For Apache jobs, Oozie has been just like a scheduler. It schedules Hadoop jobs and binds them together as one logical work. There are two kinds of Oozie jobs: +1. Oozie workflow: These are sequential set of actions to be executed. You can assume it as a relay race. Where each athlete waits for the last one to complete his part. +2. Oozie Coordinator: These are the Oozie jobs which are triggered when the data is made available to it. Think of this as the response-stimuli system in our body. In the same manner as we respond to an external stimulus, an Oozie coordinator responds to the availability of data and it rests otherwise. +APACHE FLUME +Ingesting data is an important part of our Hadoop Ecosystem. + The Flume is a service which helps in ingesting unstructured and semi-structured data into HDFS. + It gives us a solution which is reliable and distributed and helps us in collecting, aggregating and moving large amount of data sets. + It helps us to ingest online streaming data from various sources like network traffic, social media, email messages, log files etc. in HDFS. +Now, let us understand the architecture of Flume from the below diagram: +There is a Flume agent which ingests the streaming data from various data sources to HDFS. From the diagram, you can easily understand that the web server indicates the data source. Twitter is among one of the famous sources for streaming data. The flume agent has 3 components: source, sink and channel. +1. Source: it accepts the data from the incoming streamline and stores the data in the channel. +2. Channel: it acts as the local storage or the primary storage. A Channel is a temporary storage between the source of data and persistent data in the HDFS. +3. Sink: Then, our last component i.e. Sink, collects the data from the channel and commits or writes the data in the HDFS permanently. +APACHE SQOOP +The major difference between Flume and Sqoop is that: + Flume only ingests unstructured data or semi-structured data into HDFS. + While Sqoop can import as well as export structured data from RDBMS or Enterprise data warehouses to HDFS or vice versa. +Let us understand how Sqoop works using the below diagram: +When we submit Sqoop command, our main task gets divided into sub tasks which is handled by individual Map Task internally. Map Task is the sub task, which imports part of data to the Hadoop Ecosystem. Collectively, all Map tasks imports the whole data. +Export also works in a similar manner. +When we submit our Job, it is mapped into Map Tasks which brings the chunk of data from HDFS. These chunks are exported to a structured data destination. Combining all these exported chunks of data, we receive the whole data at the destination, which in most of the cases is an RDBMS (MYSQL/Oracle/SQL Server). +APACHE SOLR & LUCENE +Apache Solr and Apache Lucene are the two services which are used for searching and indexing in Hadoop Ecosystem. + Apache Lucene is based on Java, which also helps in spell checking. + If Apache Lucene is the engine, Apache Solr is the car built around it. Solr is a complete application built around Lucene. + It uses the Lucene Java search library as a core for search and full indexing. +APACHE AMBARI +Ambari is an Apache Software Foundation Project which aims at making Hadoop ecosystem more manageable. +Big Data Hadoop Certification Training +Weekday / Weekend Batc +It includes software for provisioning, managing and monitoring Apache Hadoop clusters. The Ambari provides: +1. Hadoop cluster provisioning: + It gives us step by step process for installing Hadoop services across a number of hosts. + It also handles configuration of Hadoop services over a cluster. +2. Hadoop cluster management: + It provides a central management service for starting, stopping and re-configuring Hadoop services across the cluster. +3. Hadoop cluster monitoring: + For monitoring health and status, Ambari provides us a dashboard. + The Amber Alert framework is an alerting service which notifies the user, whenever the attention is needed. For example, if a node goes down or low disk space on a node, etc. +At last, I would like to draw your attention on three things importantly: +1. Hadoop Ecosystem owes its success to the whole developer community, many big companies like Facebook, Google, Yahoo, University of California (Berkeley) etc. have contributed their part to increase Hadoop’s capabilities. +2. Inside a Hadoop Ecosystem, knowledge about one or two tools (Hadoop components) would not help in building a solution. You need to learn a set of Hadoop components, which works together to build a solution. +3. Based on the use cases, we can choose a set of services from Hadoop Ecosystem and create a tailored solution for an organization. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP ECOSYSTEM.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/HADOOP ECOSYSTEM.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..3914f2d5b9626018aa7d1e2e1c9c5e9af24a4580 GIT binary patch literal 48640 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 a%)dQQ+ZM_1s9FAPjh~zT``>?|9{3+I$*|7= literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide-relation.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide-relation.txt new file mode 100644 index 0000000..a531f53 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide-relation.txt @@ -0,0 +1,548 @@ +The First Baby&File System Metadata The Communication Protocols Robustness Data Disk Failure&依赖 +Replica Selection Safemode The Persistence&File System Metadata The Communication Protocols Robustness Data Disk Failure&AGGREGATION +The First Baby&Replica Selection Safemode The Persistence&依赖 +It&many similarity&依赖 +It&distributed file system&依赖 +application&large data set&依赖 +hdf&few POSIX requirement&依赖 +hdf&infrastructure&依赖 +hdf&Apache Nutch web search engine project&依赖 +assumption and goal hardware failure hardware failure&exception&依赖 +HDFS instance&server machine&依赖 +hundreds or thousand&server machine&AGGREGATION +each store part&each store part&依赖 +system&data& +each store part&’s datum&依赖 +each store part&’s datum&AGGREGATION +HDFS instance&hundreds or thousand&依赖 +huge number&component&AGGREGATION +non-trivial probability&failure&AGGREGATION +component&failure&依赖 +component&non-trivial probability&依赖 +component&hdf&AGGREGATION +detection&hdf&依赖 +core architectural goal&hdf&AGGREGATION +detection&hdf&依赖 +detection&fault&AGGREGATION +their&data& +hdf&batch processing&依赖 +emphasis&low latency&依赖 +high throughput&data access&AGGREGATION +emphasis&data access&依赖 +low latency&data access&AGGREGATION +emphasis&data access&依赖 +POSIX&many hard requirement&依赖 +Large Data Sets application&large data set&依赖 +typical file&size&依赖 +typical file&size&依赖 +typical file&size&依赖 +typical file&terabyte&依赖 +typical file&terabyte&依赖 +typical file&size&依赖 +hundred&node&AGGREGATION +It&million&依赖 +It&ten&依赖 +It&file&依赖 +It&million&依赖 +It&file&依赖 +million&file&AGGREGATION +It&ten&依赖 +ten&million&AGGREGATION +Simple Coherency Model HDFS application&write-once-read-many access model&依赖 +Simple Coherency Model HDFS application&file&依赖 +assumption&data coherency issue&实现 +MapReduce application&application&GENERALIZATION +MapReduce application&model&依赖 +it&datum&依赖 +size&data set&AGGREGATION +network congestion&overall throughput&依赖 +network congestion&system&依赖 +overall throughput&system&AGGREGATION +platform&choice&AGGREGATION +widespread adoption&hdf&AGGREGATION +large set&application&AGGREGATION +master/slave architecture&architecture&GENERALIZATION +namenode and datanodes hdfs&master/slave architecture&依赖 +HDFS cluster&master server&依赖 +HDFS cluster&cluster&GENERALIZATION +HDFS cluster&single NameNode&依赖 +master server&file system namespace&依赖 +number&addition&依赖 +number&addition&依赖 +number&addition&依赖 +number&addition&依赖 +number&DataNodes&AGGREGATION +number&addition&依赖 +cluster&storage&依赖 +hdf&a file system namespace&依赖 +set&DataNodes&AGGREGATION +file&one or more block&依赖 +block&set&依赖 +block&DataNodes&依赖 +NameNode&file system namespace operation&依赖 +It&DataNodes&依赖 +mapping&block&AGGREGATION +It&mapping&依赖 +It&block&依赖 +system&clients& +DataNodes&block creation&依赖 +DataNodes&instruction&依赖 +DataNodes&NameNode&依赖 +hdf architecture namenode and datanode&software&依赖 +piece&software&AGGREGATION +machine&GNU/Linux operating system&依赖 +machine&Java&依赖 +DataNode software&software&GENERALIZATION +machine&NameNode&依赖 +Usage&portable Java language&AGGREGATION +wide range&machine&AGGREGATION +dedicated machine&machine&GENERALIZATION +NameNode software&software&GENERALIZATION +dedicated machine&NameNode software&依赖 +typical deployment&dedicated machine&依赖 +one instance&DataNode software&AGGREGATION +existence&single NameNode&AGGREGATION +existence&architecture&实现 +existence&system&实现 +architecture&system&AGGREGATION +NameNode&HDFS metada&依赖 +system&flows&依赖 +system&such a way&依赖 +user datum&NameNode&依赖 +File System Namespace hdf&traditional hierarchical file organization&依赖 +user&directory&依赖 +user&directory and store file&依赖 +one&file&依赖 +file system namespace hierarchy&most other existing file system&依赖 +hdf&user quota&实现 +hdf&hard link&依赖 +HDFS architecture&feature&实现 +HDFS architecture&architecture&GENERALIZATION +NameNode&file system namespace&依赖 +change&NameNode&依赖 +its&properties& +number&replica&AGGREGATION +application&number&依赖 +application&file&依赖 +replica&file&AGGREGATION +application&replica&依赖 +number&file&AGGREGATION +copy&file&AGGREGATION +number©&AGGREGATION +replication factor&file&AGGREGATION +information&NameNode&依赖 +It&file&依赖 +It&sequence&依赖 +sequence&block&AGGREGATION +It&block&依赖 +block&fault tolerance&依赖 +block&file&AGGREGATION +block size and replication factor&file&依赖 +replication&block&AGGREGATION +NameNode&replication&依赖 +NameNode&block&依赖 +NameNode&decision&依赖 +Receipt&Heartbeat&AGGREGATION +list&block&AGGREGATION +Blockreport&list&依赖 +Blockreport&DataNode&依赖 +Blockreport&block&依赖 +placement&replica&AGGREGATION +replica placement&hdf&依赖 +replica placement&most other distributed file system&依赖 +lot&tuning and experience&AGGREGATION +feature&lot&依赖 +feature&tuning and experience&依赖 +purpose&rack-aware replica placement policy&AGGREGATION +purpose&data reliability&依赖 +current implementation&direction&依赖 +current implementation&direction&依赖 +short-term goal&it&依赖 +its&behavior& +Large HDFS instance&cluster&依赖 +Large HDFS instance&computer&依赖 +cluster&computer&AGGREGATION +NameNode&rack id&依赖 +simple but non-optimal policy&replica&依赖 +entire rack&bandwidth&依赖 +entire rack&use&依赖 +entire rack&multiple rack&依赖 +use&bandwidth&AGGREGATION +policy&replica&依赖 +policy&cluster&依赖 +write&block&依赖 +policy&cost&依赖 +HDFS&policy& +’s placement policy&one replica&依赖 +’s placement policy&one node&依赖 +inter-rack write traffic&write performance&依赖 +policy&inter-rack write traffic&依赖 +chance&rack failure&AGGREGATION +policy&impact datum reliability and availability guarantee&依赖 +it&aggregate network bandwidth&依赖 +datum&three&依赖 +datum&two unique rack&依赖 +replica&rack&依赖 +other third&rack&依赖 +two third&replica&AGGREGATION +One third&replica&AGGREGATION +policy&performance&依赖 +current , default replica placement policy&progress&依赖 +current , default replica placement policy&progress&依赖 +hdf&replica&依赖 +Replica Selection&global bandwidth consumption&依赖 +hdf&read request&依赖 +replica&remote replica&依赖 +NameNode&special state&依赖 +NameNode&special state&依赖 +Replication&data block&AGGREGATION +NameNode&Heartbeat and Blockreport message&依赖 +NameNode&DataNodes&依赖 +Blockreport&data block&依赖 +list&data block&AGGREGATION +Blockreport&hosting&依赖 +block&replica&依赖 +block&specified minimum number&依赖 +specified minimum number&replica&AGGREGATION +data block&block&GENERALIZATION +replica&data block&AGGREGATION +minimum number&replica&AGGREGATION +namenode exit&namenode (&依赖 +namenode exit&Safemode state&依赖 +namenode exit&safely replicate datum block check&依赖 +namenode exit&additional 30 second&依赖 +namenode exit&Safemode state&依赖 +namenode exit&namenode (&依赖 +namenode exit&Safemode state&依赖 +namenode exit&safely replicate datum block check&依赖 +namenode exit&namenode (&依赖 +namenode exit&additional 30 second&依赖 +namenode exit&safely replicate datum block check&依赖 +namenode exit&namenode (&依赖 +namenode exit&Safemode state&依赖 +namenode exit&Safemode state&依赖 +namenode exit&Safemode state&依赖 +namenode exit&Safemode state&依赖 +namenode exit&additional 30 second&依赖 +namenode exit&additional 30 second&依赖 +namenode exit&Safemode state&依赖 +namenode exit&safely replicate datum block check&依赖 +namenode exit&namenode (&依赖 +namenode exit&Safemode state&依赖 +namenode exit&safely replicate datum block check&依赖 +namenode exit&additional 30 second&依赖 +namenode exit&Safemode state&依赖 +It&list&依赖 +It&data block&依赖 +It&)&依赖 +specified number&replica&AGGREGATION +NameNode&block&依赖 +NameNode&other datanode&依赖 +HDFS namespace&NameNode&依赖 +Persistence&File System Metadata&AGGREGATION +NameNode&transaction log&依赖 +NameNode&EditLog&依赖 +NameNode&system metada&依赖 +NameNode&file&依赖 +NameNode&local host OS file system&依赖 +its&system& +entire file system namespace&file&依赖 +NameNode&system& +FsImage&’s local file system&依赖 +FsImage&file&依赖 +NameNode&memory&依赖 +NameNode&entire file system namespace and file blockmap&依赖 +image&entire file system namespace and file blockmap&AGGREGATION +4 GB&RAM&AGGREGATION +huge number&files and directory&AGGREGATION +in-memory representation&FsImage&AGGREGATION +it&FsImage and EditLog&依赖 +it&disk&依赖 +It&old EditLog&依赖 +transaction&persistent FsImage&依赖 +its&transactions& +checkpoint¤t implementation&依赖 +Work&periodic checkpointing&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +DataNode&knowledge&依赖 +DataNode&HDFS file&依赖 +It&HDFS datum&依赖 +It&block&依赖 +It&HDFS datum&依赖 +block&HDFS datum&AGGREGATION +It&block&依赖 +It&block&依赖 +It&HDFS datum&依赖 +DataNode&file&依赖 +DataNode&same directory&依赖 +optimal number&file&AGGREGATION +it&heuristic&依赖 +It&local file&依赖 +local file system&single directory&依赖 +local file system&huge number&依赖 +huge number&file&AGGREGATION +It&same directory&依赖 +list&HDFS data block&AGGREGATION +it&local file system&依赖 +Communication Protocols All HDFS communication protocol&TCP/IP protocol&依赖 +Communication Protocols All HDFS communication protocol&top&依赖 +top&TCP/IP protocol&AGGREGATION +client&configurable TCP port&依赖 +client&NameNode machine&依赖 +NameNode machine&machine&GENERALIZATION +client&connection&依赖 +It&NameNode&依赖 +It&ClientProtocol&依赖 +DataNodes&DataNode Protocol&依赖 +DataNodes&NameNode&依赖 +( rpc ) abstraction&Client Protocol&依赖 +NameNode&rpc&依赖 +NameNode&design&依赖 +it&RPC request&依赖 +robustness primary objective&hdf&AGGREGATION +robustness primary objective&datum&依赖 +presence&failure&AGGREGATION +three common type&failure&AGGREGATION +Data Disk Failure&NameNode&依赖 +Data Disk Failure&Heartbeat message&依赖 +network partition&subset&依赖 +network partition&DataNodes&依赖 +subset&DataNodes&AGGREGATION +NameNode&condition&依赖 +NameNode&absence&依赖 +NameNode&Heartbeat message&依赖 +absence&Heartbeat message&AGGREGATION +NameNode mark&recent heartbeat&依赖 +datum&hdf&依赖 +DataNode death&block&依赖 +DataNode death&replication factor&依赖 +replication factor&block&AGGREGATION +their&value& +HDFS architecture&data rebalancing scheme&依赖 +scheme&one DataNode&依赖 +scheme&datum&依赖 +free space&certain threshold&依赖 +scheme&one DataNode to ###&依赖 +free space&certain threshold&依赖 +scheme&additional replica&依赖 +scheme&additional replica&依赖 +scheme&particular file&依赖 +event&sudden high demand&AGGREGATION +scheme&sudden high demand&依赖 +type&data rebalancing scheme&AGGREGATION +block&datum&AGGREGATION +corruption&fault&依赖 +corruption&storage device&依赖 +checksum checking&HDFS file&依赖 +contents&HDFS file&AGGREGATION +checksum checking&contents&依赖 +checksum checking&HDFS file&依赖 +checksum checking&contents&依赖 +checksum checking&HDFS file&依赖 +checksum checking&contents&依赖 +HDFS file&file&GENERALIZATION +it&separate hidden file&依赖 +it&checksum&依赖 +it&block&依赖 +block&file and store&AGGREGATION +checksum&block&AGGREGATION +client&HDFS file&依赖 +it&file and store&依赖 +file contents&contents&GENERALIZATION +it&checksum&依赖 +client&file contents&依赖 +replica&block&AGGREGATION +DataNode&replica&依赖 +DataNode&block&依赖 +central data structure&hdf&AGGREGATION +Metadata Disk Failure The FsImage&hdf&依赖 +corruption&file&AGGREGATION +corruption&HDFS instance&依赖 +multiple copy&FsImage and EditLog&AGGREGATION +update&updated synchronously&依赖 +synchronous update&rate&依赖 +rate&namespace transaction&AGGREGATION +synchronous update&second&依赖 +synchronous update&namespace transaction&依赖 +synchronous update&multiple copy&AGGREGATION +it&latest consistent fsimage&依赖 +it&use&依赖 +NameNode machine&HDFS cluster&依赖 +NameNode machine&failure&依赖 +single point&failure&AGGREGATION +automatic restart and failover&NameNode software&AGGREGATION +particular instant&time&AGGREGATION +copy&datum&AGGREGATION +snapshot snapshot©&依赖 +snapshot snapshot&support&依赖 +snapshot snapshot&datum&依赖 +One usage&corrupted HDFS instance&依赖 +One usage&snapshot feature&AGGREGATION +hdf&snapshot&依赖 +application&datum&依赖 +they&one or more time&依赖 +hdf&write-once-read-many semantics&依赖 +hdf&file&依赖 +chunk&different DataNode&依赖 +HDFS client&file datum&依赖 +HDFS client&temporary local file&依赖 +HDFS client&client&GENERALIZATION +HDFS client&fact&依赖 +Application write&temporary local file&依赖 +client contact&NameNode&依赖 +local file&datum worth&依赖 +local file&one HDFS block size&依赖 +client contact&NameNode&依赖 +client contact&NameNode&依赖 +namenode insert&file name&依赖 +namenode insert&file system hierarchy&依赖 +namenode insert&file name&依赖 +namenode insert&file system hierarchy&依赖 +NameNode&DataNode&依赖 +NameNode&identity&依赖 +identity&DataNode&AGGREGATION +NameNode&client request&依赖 +client&datum&依赖 +client&block&依赖 +client&datum&依赖 +client&datum&依赖 +client&block&依赖 +client&block&依赖 +un-flushed datum&DataNode&依赖 +client&NameNode&依赖 +NameNode&persistent store&依赖 +NameNode&point&依赖 +NameNode&file creation operation&依赖 +careful consideration&target application&AGGREGATION +above approach&target application&依赖 +above approach&careful consideration&依赖 +application&streaming write&依赖 +application&file&依赖 +network speed&writes&依赖 +client&client side buffering&依赖 +client&remote file&依赖 +network speed&network impact throughput&依赖 +Earlier distributed file system&client side caching&依赖 +Earlier distributed file system&client side caching&依赖 +higher performance&data upload&AGGREGATION +POSIX requirement&data upload&依赖 +POSIX requirement&higher performance&依赖 +client&datum&依赖 +client&HDFS file&依赖 +its&data& +datum&local file&依赖 +HDFS file&replication factor&依赖 +replication factor&three&AGGREGATION +HDFS file&three&依赖 +local file&user datum&依赖 +full block&user datum&AGGREGATION +local file&full block&依赖 +client&list&依赖 +list&DataNodes&AGGREGATION +client&NameNode&依赖 +DataNodes&replica&依赖 +DataNodes&block&依赖 +list&DataNodes&依赖 +client&first DataNode&依赖 +client&data block&依赖 +its&repository& +first DataNode&datum&依赖 +turn start&portion&依赖 +portion&data block&AGGREGATION +second DataNode&portion&依赖 +turn start&data block&依赖 +second DataNode&portion&依赖 +third DataNode&datum&依赖 +third DataNode&local repository&依赖 +DataNode&previous one&依赖 +DataNode&datum&依赖 +DataNode&pipeline&依赖 +datum&one DataNode&依赖 +datum&next&依赖 +Accessibility hdf&many different way&依赖 +Accessibility hdf&application&依赖 +file&HDFS instance&AGGREGATION +FS Shell HDFS&user datum&依赖 +form&files and directory&AGGREGATION +FS shell&user interact&依赖 +FS shell&datum&依赖 +syntax&command set&AGGREGATION +Action Command&directory&依赖 +txt FS shell&application&依赖 +cat / foodir/myfile&language&依赖 +Action Command&/ foodir bin/hadoop dfs&依赖 +contents&file&AGGREGATION +Action Command&Safemode bin/hadoop dfsadmin&依赖 +list&DataNodes bin/hadoop dfsadmin&AGGREGATION +refreshnodes browser interface a typical hdf&web server&依赖 +safemode&Generate&依赖 +list&refreshnodes browser interface a typical hdf&依赖 +Action Command&cluster&依赖 +its&files& +file&user&依赖 +it&hdf&依赖 +hdf first&/ trash directory&依赖 +hdf first&it&依赖 +hdf first&file&依赖 +it&/ trash&依赖 +file&configurable amount&依赖 +configurable amount&time&AGGREGATION +file&/ trash&依赖 +file&time&依赖 +expiry&life&AGGREGATION +NameNode&/ trash&依赖 +NameNode&file&依赖 +NameNode&HDFS namespace&依赖 +NameNode&file&依赖 +its&life& +deletion&block&依赖 +deletion&file&AGGREGATION +time&corresponding increase&AGGREGATION +user&file&依赖 +it&/ trash directory&依赖 +user&file&依赖 +he/she&that&依赖 +he/she&/ trash directory&依赖 +/ trash directory&file&依赖 +/ trash directory&latest copy&依赖 +latest copy&file&AGGREGATION +hdf&directory&依赖 +/ trash directory&one special feature&依赖 +hdf&policy&依赖 +hdf&file&依赖 +current default policy&/ trash&依赖 +current default policy&file&依赖 +policy&future&依赖 +policy&defined interface&依赖 +NameNode&excess replica&依赖 +next heartbeat transfer&information&依赖 +corresponding free space&cluster&依赖 +DataNode&corresponding block&依赖 +completion&setReplication API call&AGGREGATION +appearance&free space&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt new file mode 100644 index 0000000..811d08e --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt @@ -0,0 +1,172 @@ +HDFS Architecture Guide +Introduction +Assumptions and Goals +Hardware Failure +Streaming Data Access +Large Data Sets +Simple Coherency Model +“Moving Computation is Cheaper than Moving Data” +Portability Across Heterogeneous Hardware and Software Platforms +NameNode and DataNodes +The File System Namespace +Data Replication +Replica Placement: The First Baby Steps +Replica Selection +Safemode +The Persistence of File System Metadata +The Communication Protocols +Robustness +Data Disk Failure, Heartbeats and Re-Replication +Cluster Rebalancing +Data Integrity +Metadata Disk Failure +Snapshots +Data Organization +Data Blocks +Staging +Replication Pipelining +Accessibility +FS Shell +DFSAdmin +Browser Interface +Space Reclamation +File Deletes and Undeletes +Decrease Replication Factor +References +Introduction +The Hadoop Distributed File System (HDFS) is a distributed file system designed to run on commodity hardware. It has many similarities with existing distributed file systems. However, the differences from other distributed file systems are significant. HDFS is highly fault-tolerant and is designed to be deployed on low-cost hardware. HDFS provides high throughput access to application data and is suitable for applications that have large data sets. HDFS relaxes a few POSIX requirements to enable streaming access to file system data. HDFS was originally built as infrastructure for the Apache Nutch web search engine project. HDFS is now an Apache Hadoop subproject. The project URL is https://hadoop.apache.org/hdfs/. + +Assumptions and Goals +Hardware Failure +Hardware failure is the norm rather than the exception. An HDFS instance may consist of hundreds or thousands of server machines, each storing part of the file system’s data. The fact that there are a huge number of components and that each component has a non-trivial probability of failure means that some component of HDFS is always non-functional. Therefore, detection of faults and quick, automatic recovery from them is a core architectural goal of HDFS. + +Streaming Data Access +Applications that run on HDFS need streaming access to their data sets. They are not general purpose applications that typically run on general purpose file systems. HDFS is designed more for batch processing rather than interactive use by users. The emphasis is on high throughput of data access rather than low latency of data access. POSIX imposes many hard requirements that are not needed for applications that are targeted for HDFS. POSIX semantics in a few key areas has been traded to increase data throughput rates. + +Large Data Sets +Applications that run on HDFS have large data sets. A typical file in HDFS is gigabytes to terabytes in size. Thus, HDFS is tuned to support large files. It should provide high aggregate data bandwidth and scale to hundreds of nodes in a single cluster. It should support tens of millions of files in a single instance. + +Simple Coherency Model +HDFS applications need a write-once-read-many access model for files. A file once created, written, and closed need not be changed. This assumption simplifies data coherency issues and enables high throughput data access. A MapReduce application or a web crawler application fits perfectly with this model. There is a plan to support appending-writes to files in the future. + +“Moving Computation is Cheaper than Moving Data” +A computation requested by an application is much more efficient if it is executed near the data it operates on. This is especially true when the size of the data set is huge. This minimizes network congestion and increases the overall throughput of the system. The assumption is that it is often better to migrate the computation closer to where the data is located rather than moving the data to where the application is running. HDFS provides interfaces for applications to move themselves closer to where the data is located. + +Portability Across Heterogeneous Hardware and Software Platforms +HDFS has been designed to be easily portable from one platform to another. This facilitates widespread adoption of HDFS as a platform of choice for a large set of applications. + +NameNode and DataNodes +HDFS has a master/slave architecture. An HDFS cluster consists of a single NameNode, a master server that manages the file system namespace and regulates access to files by clients. In addition, there are a number of DataNodes, usually one per node in the cluster, which manage storage attached to the nodes that they run on. HDFS exposes a file system namespace and allows user data to be stored in files. Internally, a file is split into one or more blocks and these blocks are stored in a set of DataNodes. The NameNode executes file system namespace operations like opening, closing, and renaming files and directories. It also determines the mapping of blocks to DataNodes. The DataNodes are responsible for serving read and write requests from the file system’s clients. The DataNodes also perform block creation, deletion, and replication upon instruction from the NameNode. + +HDFS Architecture +The NameNode and DataNode are pieces of software designed to run on commodity machines. These machines typically run a GNU/Linux operating system (OS). HDFS is built using the Java language; any machine that supports Java can run the NameNode or the DataNode software. Usage of the highly portable Java language means that HDFS can be deployed on a wide range of machines. A typical deployment has a dedicated machine that runs only the NameNode software. Each of the other machines in the cluster runs one instance of the DataNode software. The architecture does not preclude running multiple DataNodes on the same machine but in a real deployment that is rarely the case. + +The existence of a single NameNode in a cluster greatly simplifies the architecture of the system. The NameNode is the arbitrator and repository for all HDFS metadata. The system is designed in such a way that user data never flows through the NameNode. + +The File System Namespace +HDFS supports a traditional hierarchical file organization. A user or an application can create directories and store files inside these directories. The file system namespace hierarchy is similar to most other existing file systems; one can create and remove files, move a file from one directory to another, or rename a file. HDFS does not yet implement user quotas. HDFS does not support hard links or soft links. However, the HDFS architecture does not preclude implementing these features. + +The NameNode maintains the file system namespace. Any change to the file system namespace or its properties is recorded by the NameNode. An application can specify the number of replicas of a file that should be maintained by HDFS. The number of copies of a file is called the replication factor of that file. This information is stored by the NameNode. + +Data Replication +HDFS is designed to reliably store very large files across machines in a large cluster. It stores each file as a sequence of blocks; all blocks in a file except the last block are the same size. The blocks of a file are replicated for fault tolerance. The block size and replication factor are configurable per file. An application can specify the number of replicas of a file. The replication factor can be specified at file creation time and can be changed later. Files in HDFS are write-once and have strictly one writer at any time. + +The NameNode makes all decisions regarding replication of blocks. It periodically receives a Heartbeat and a Blockreport from each of the DataNodes in the cluster. Receipt of a Heartbeat implies that the DataNode is functioning properly. A Blockreport contains a list of all blocks on a DataNode. + +HDFS DataNodes +Replica Placement: The First Baby Steps +The placement of replicas is critical to HDFS reliability and performance. Optimizing replica placement distinguishes HDFS from most other distributed file systems. This is a feature that needs lots of tuning and experience. The purpose of a rack-aware replica placement policy is to improve data reliability, availability, and network bandwidth utilization. The current implementation for the replica placement policy is a first effort in this direction. The short-term goals of implementing this policy are to validate it on production systems, learn more about its behavior, and build a foundation to test and research more sophisticated policies. + +Large HDFS instances run on a cluster of computers that commonly spread across many racks. Communication between two nodes in different racks has to go through switches. In most cases, network bandwidth between machines in the same rack is greater than network bandwidth between machines in different racks. + +The NameNode determines the rack id each DataNode belongs to via the process outlined in Hadoop Rack Awareness. A simple but non-optimal policy is to place replicas on unique racks. This prevents losing data when an entire rack fails and allows use of bandwidth from multiple racks when reading data. This policy evenly distributes replicas in the cluster which makes it easy to balance load on component failure. However, this policy increases the cost of writes because a write needs to transfer blocks to multiple racks. + +For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on one node in the local rack, another on a node in a different (remote) rack, and the last on a different node in the same remote rack. This policy cuts the inter-rack write traffic which generally improves write performance. The chance of rack failure is far less than that of node failure; this policy does not impact data reliability and availability guarantees. However, it does reduce the aggregate network bandwidth used when reading data since a block is placed in only two unique racks rather than three. With this policy, the replicas of a file do not evenly distribute across the racks. One third of replicas are on one node, two thirds of replicas are on one rack, and the other third are evenly distributed across the remaining racks. This policy improves write performance without compromising data reliability or read performance. + +The current, default replica placement policy described here is a work in progress. + +Replica Selection +To minimize global bandwidth consumption and read latency, HDFS tries to satisfy a read request from a replica that is closest to the reader. If there exists a replica on the same rack as the reader node, then that replica is preferred to satisfy the read request. If angg/ HDFS cluster spans multiple data centers, then a replica that is resident in the local data center is preferred over any remote replica. + +Safemode +On startup, the NameNode enters a special state called Safemode. Replication of data blocks does not occur when the NameNode is in the Safemode state. The NameNode receives Heartbeat and Blockreport messages from the DataNodes. A Blockreport contains the list of data blocks that a DataNode is hosting. Each block has a specified minimum number of replicas. A block is considered safely replicated when the minimum number of replicas of that data block has checked in with the NameNode. After a configurable percentage of safely replicated data blocks checks in with the NameNode (plus an additional 30 seconds), the NameNode exits the Safemode state. It then determines the list of data blocks (if any) that still have fewer than the specified number of replicas. The NameNode then replicates these blocks to other DataNodes. + +The Persistence of File System Metadata +The HDFS namespace is stored by the NameNode. The NameNode uses a transaction log called the EditLog to persistently record every change that occurs to file system metadata. For example, creating a new file in HDFS causes the NameNode to insert a record into the EditLog indicating this. Similarly, changing the replication factor of a file causes a new record to be inserted into the EditLog. The NameNode uses a file in its local host OS file system to store the EditLog. The entire file system namespace, including the mapping of blocks to files and file system properties, is stored in a file called the FsImage. The FsImage is stored as a file in the NameNode’s local file system too. + +The NameNode keeps an image of the entire file system namespace and file Blockmap in memory. This key metadata item is designed to be compact, such that a NameNode with 4 GB of RAM is plenty to support a huge number of files and directories. When the NameNode starts up, it reads the FsImage and EditLog from disk, applies all the transactions from the EditLog to the in-memory representation of the FsImage, and flushes out this new version into a new FsImage on disk. It can then truncate the old EditLog because its transactions have been applied to the persistent FsImage. This process is called a checkpoint. In the current implementation, a checkpoint only occurs when the NameNode starts up. Work is in progress to support periodic checkpointing in the near future. + +The DataNode stores HDFS data in files in its local file system. The DataNode has no knowledge about HDFS files. It stores each block of HDFS data in a separate file in its local file system. The DataNode does not create all files in the same directory. Instead, it uses a heuristic to determine the optimal number of files per directory and creates subdirectories appropriately. It is not optimal to create all local files in the same directory because the local file system might not be able to efficiently support a huge number of files in a single directory. When a DataNode starts up, it scans through its local file system, generates a list of all HDFS data blocks that correspond to each of these local files and sends this report to the NameNode: this is the Blockreport. + +The Communication Protocols +All HDFS communication protocols are layered on top of the TCP/IP protocol. A client establishes a connection to a configurable TCP port on the NameNode machine. It talks the ClientProtocol with the NameNode. The DataNodes talk to the NameNode using the DataNode Protocol. A Remote Procedure Call (RPC) abstraction wraps both the Client Protocol and the DataNode Protocol. By design, the NameNode never initiates any RPCs. Instead, it only responds to RPC requests issued by DataNodes or clients. + +Robustness +The primary objective of HDFS is to store data reliably even in the presence of failures. The three common types of failures are NameNode failures, DataNode failures and network partitions. + +Data Disk Failure, Heartbeats and Re-Replication +Each DataNode sends a Heartbeat message to the NameNode periodically. A network partition can cause a subset of DataNodes to lose connectivity with the NameNode. The NameNode detects this condition by the absence of a Heartbeat message. The NameNode marks DataNodes without recent Heartbeats as dead and does not forward any new IO requests to them. Any data that was registered to a dead DataNode is not available to HDFS any more. DataNode death may cause the replication factor of some blocks to fall below their specified value. The NameNode constantly tracks which blocks need to be replicated and initiates replication whenever necessary. The necessity for re-replication may arise due to many reasons: a DataNode may become unavailable, a replica may become corrupted, a hard disk on a DataNode may fail, or the replication factor of a file may be increased. + +Cluster Rebalancing +The HDFS architecture is compatible with data rebalancing schemes. A scheme might automatically move data from one DataNode to another if the free space on a DataNode falls below a certain threshold. In the event of a sudden high demand for a particular file, a scheme might dynamically create additional replicas and rebalance other data in the cluster. These types of data rebalancing schemes are not yet implemented. + +Data Integrity +It is possible that a block of data fetched from a DataNode arrives corrupted. This corruption can occur because of faults in a storage device, network faults, or buggy software. The HDFS client software implements checksum checking on the contents of HDFS files. When a client creates an HDFS file, it computes a checksum of each block of the file and stores these checksums in a separate hidden file in the same HDFS namespace. When a client retrieves file contents it verifies that the data it received from each DataNode matches the checksum stored in the associated checksum file. If not, then the client can opt to retrieve that block from another DataNode that has a replica of that block. + +Metadata Disk Failure +The FsImage and the EditLog are central data structures of HDFS. A corruption of these files can cause the HDFS instance to be non-functional. For this reason, the NameNode can be configured to support maintaining multiple copies of the FsImage and EditLog. Any update to either the FsImage or EditLog causes each of the FsImages and EditLogs to get updated synchronously. This synchronous updating of multiple copies of the FsImage and EditLog may degrade the rate of namespace transactions per second that a NameNode can support. However, this degradation is acceptable because even though HDFS applications are very data intensive in nature, they are not metadata intensive. When a NameNode restarts, it selects the latest consistent FsImage and EditLog to use. + +The NameNode machine is a single point of failure for an HDFS cluster. If the NameNode machine fails, manual intervention is necessary. Currently, automatic restart and failover of the NameNode software to another machine is not supported. + +Snapshots +Snapshots support storing a copy of data at a particular instant of time. One usage of the snapshot feature may be to roll back a corrupted HDFS instance to a previously known good point in time. HDFS does not currently support snapshots but will in a future release. + +Data Organization +Data Blocks +HDFS is designed to support very large files. Applications that are compatible with HDFS are those that deal with large data sets. These applications write their data only once but they read it one or more times and require these reads to be satisfied at streaming speeds. HDFS supports write-once-read-many semantics on files. A typical block size used by HDFS is 64 MB. Thus, an HDFS file is chopped up into 64 MB chunks, and if possible, each chunk will reside on a different DataNode. + +Staging +A client request to create a file does not reach the NameNode immediately. In fact, initially the HDFS client caches the file data into a temporary local file. Application writes are transparently redirected to this temporary local file. When the local file accumulates data worth over one HDFS block size, the client contacts the NameNode. The NameNode inserts the file name into the file system hierarchy and allocates a data block for it. The NameNode responds to the client request with the identity of the DataNode and the destination data block. Then the client flushes the block of data from the local temporary file to the specified DataNode. When a file is closed, the remaining un-flushed data in the temporary local file is transferred to the DataNode. The client then tells the NameNode that the file is closed. At this point, the NameNode commits the file creation operation into a persistent store. If the NameNode dies before the file is closed, the file is lost. + +The above approach has been adopted after careful consideration of target applications that run on HDFS. These applications need streaming writes to files. If a client writes to a remote file directly without any client side buffering, the network speed and the congestion in the network impacts throughput considerably. This approach is not without precedent. Earlier distributed file systems, e.g. AFS, have used client side caching to improve performance. A POSIX requirement has been relaxed to achieve higher performance of data uploads. + +Replication Pipelining +When a client is writing data to an HDFS file, its data is first written to a local file as explained in the previous section. Suppose the HDFS file has a replication factor of three. When the local file accumulates a full block of user data, the client retrieves a list of DataNodes from the NameNode. This list contains the DataNodes that will host a replica of that block. The client then flushes the data block to the first DataNode. The first DataNode starts receiving the data in small portions (4 KB), writes each portion to its local repository and transfers that portion to the second DataNode in the list. The second DataNode, in turn starts receiving each portion of the data block, writes that portion to its repository and then flushes that portion to the third DataNode. Finally, the third DataNode writes the data to its local repository. Thus, a DataNode can be receiving data from the previous one in the pipeline and at the same time forwarding data to the next one in the pipeline. Thus, the data is pipelined from one DataNode to the next. + +Accessibility +HDFS can be accessed from applications in many different ways. Natively, HDFS provides a Java API for applications to use. A C language wrapper for this Java API is also available. In addition, an HTTP browser can also be used to browse the files of an HDFS instance. Work is in progress to expose HDFS through the WebDAV protocol. + +FS Shell +HDFS allows user data to be organized in the form of files and directories. It provides a commandline interface called FS shell that lets a user interact with the data in HDFS. The syntax of this command set is similar to other shells (e.g. bash, csh) that users are already familiar with. Here are some sample action/command pairs: + +Action Command +Create a directory named /foodir bin/hadoop dfs -mkdir /foodir +Remove a directory named /foodir bin/hadoop dfs -rmr /foodir +View the contents of a file named /foodir/myfile.txt bin/hadoop dfs -cat /foodir/myfile.txt +FS shell is targeted for applications that need a scripting language to interact with the stored data. + +DFSAdmin +The DFSAdmin command set is used for administering an HDFS cluster. These are commands that are used only by an HDFS administrator. Here are some sample action/command pairs: + +Action Command +Put the cluster in Safemode bin/hadoop dfsadmin -safemode enter +Generate a list of DataNodes bin/hadoop dfsadmin -report +Recommission or decommission DataNode(s) bin/hadoop dfsadmin -refreshNodes +Browser Interface +A typical HDFS install configures a web server to expose the HDFS namespace through a configurable TCP port. This allows a user to navigate the HDFS namespace and view the contents of its files using a web browser. + +Space Reclamation +File Deletes and Undeletes +When a file is deleted by a user or an application, it is not immediately removed from HDFS. Instead, HDFS first renames it to a file in the /trash directory. The file can be restored quickly as long as it remains in /trash. A file remains in /trash for a configurable amount of time. After the expiry of its life in /trash, the NameNode deletes the file from the HDFS namespace. The deletion of a file causes the blocks associated with the file to be freed. Note that there could be an appreciable time delay between the time a file is deleted by a user and the time of the corresponding increase in free space in HDFS. + +A user can Undelete a file after deleting it as long as it remains in the /trash directory. If a user wants to undelete a file that he/she has deleted, he/she can navigate the /trash directory and retrieve the file. The /trash directory contains only the latest copy of the file that was deleted. The /trash directory is just like any other directory with one special feature: HDFS applies specified policies to automatically delete files from this directory. The current default policy is to delete files from /trash that are more than 6 hours old. In the future, this policy will be configurable through a well defined interface. + +Decrease Replication Factor +When the replication factor of a file is reduced, the NameNode selects excess replicas that can be deleted. The next Heartbeat transfers this information to the DataNode. The DataNode then removes the corresponding blocks and the corresponding free space appears in the cluster. Once again, there might be a time delay between the completion of the setReplication API call and the appearance of free space in the cluster. + +References +HDFS Java API: https://hadoop.apache.org/core/docs/current/api/ + +HDFS source code: https://hadoop.apache.org/hdfs/version_control.html + +by Dhruba Borthakur \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS Architecture Guide.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..5d0278ae9431acf4a92aca1f2c1e0801518a91ea GIT binary patch literal 74752 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

bzzs&&4qTR`Rn^Ni06J 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 M_0IgSc}VR40AKtkZ~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS-relation.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS-relation.txt new file mode 100644 index 0000000..a41386e --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS-relation.txt @@ -0,0 +1,204 @@ +number&separate machine&AGGREGATION +dataset&single physical machine&依赖 +storage capacity&single physical machine&AGGREGATION +dataset&storage capacity&依赖 +it&it&依赖 +network&machine&AGGREGATION +separate machine&storage&依赖 +Hadoop&distributed filesystem&依赖 +Design&hdf&AGGREGATION +cluster&commodity hardware&AGGREGATION +“ Very large ”&file&依赖 +hundred&megabytes , gigabytes , or terabyte&AGGREGATION +“ Very large ”&file&依赖 +store petabyte&datum&AGGREGATION +Hadoop cluster&store petabyte&依赖 +Hadoop cluster&datum&依赖 +hdf&idea&依赖 +dataset&source&依赖 +various analysis&dataset over time&依赖 +Hadoop&expensive , highly reliable hardware&依赖 +Hadoop&run&依赖 +chance&large cluster&依赖 +chance&which&依赖 +cluster&commodity hardware ( commonly available hardware&AGGREGATION +chance&which&依赖 +chance&node failure&AGGREGATION +chance&large cluster&依赖 +chance&large cluster&依赖 +chance&which&依赖 +face&such failure&AGGREGATION +ten&milliseconds range&AGGREGATION +namenode&filesystem metada&依赖 +lot&small file&AGGREGATION +limit&namenode&依赖 +limit&amount&依赖 +number&file&AGGREGATION +amount&memory&AGGREGATION +namenode&memory&依赖 +file&single writer&依赖 +write&end&依赖 +write&file&依赖 +end&file&AGGREGATION +hdf&concept&依赖 +hdf&block&依赖 +concept&block&AGGREGATION +file&block-sized chunk&依赖 +several benefits.&block abstraction&依赖 +several benefits.&distributed filesystem&依赖 +’s nothing&block&依赖 +’s nothing&a file&依赖 +they&advantage&依赖 +they&advantage of ###&依赖 +unit&abstraction a block&AGGREGATION +storage subsystem deal&storage management (&实现 +storage subsystem deal&storage management (&实现 +block&replication&依赖 +block&separate machine&依赖 +small number&separate machine and typically three )&AGGREGATION +block&small number&依赖 +block&typically three )&依赖 +reason&seek&依赖 +cost&seek&AGGREGATION +reason&cost&依赖 +time&block&依赖 +time&start&依赖 +start&block&AGGREGATION +time&disk transfer rate&依赖 +time&disk transfer rate&依赖 +time&disk transfer rate&依赖 +seek time&transfer time&AGGREGATION +many HDFS installation&128 MB block&依赖 +transfer speed&disk drive&依赖 +transfer speed&new generation&依赖 +new generation&disk drive&AGGREGATION +HDFS cluster&node operating&依赖 +HDFS cluster&namenode&依赖 +HDFS cluster&master-worker pattern&依赖 +number&datanode ( worker&AGGREGATION +two type&node operating&AGGREGATION +HDFS cluster&cluster&GENERALIZATION +HDFS cluster&two type&依赖 +namenode&filesystem namespace&依赖 +It&filesystem tree&依赖 +information&form&依赖 +information&local disk&依赖 +information&two file&依赖 +information&namespace image&依赖 +form&two file&AGGREGATION +block&datanode&依赖 +namenode&datanode&依赖 +Hadoop cluster&cluster&GENERALIZATION +one primary component&hadoop cluster and hdf&AGGREGATION +TaskTraker } hdf&hadoop cluster and hdf&依赖 +mapping&block&AGGREGATION +master ( namenode )&file system namespace operation&依赖 +system&clients& +file system&system&GENERALIZATION +datanode&filesystem&依赖 +workhorse&filesystem&AGGREGATION +list&block&AGGREGATION +they&block&依赖 +They&block&依赖 +they&list&依赖 +they&storing&依赖 +what precaution hdf&file system&依赖 +persistent state&filesystem metada&AGGREGATION +what precaution hdf&what precaution hdf&依赖 +namenode failure&persistent state&依赖 +namenode failure&filesystem metada&依赖 +case&namenode failure&AGGREGATION +first way&file&依赖 +namenode&persistent state&依赖 +namenode&multiple filesystem&依赖 +its&state& +It&secondary namenode&依赖 +its&name& +main role&namespace image&依赖 +Its&role& +namenode&file and block&依赖 +namenode&filesystem&依赖 +namenode&reference&依赖 +namenode&memory&依赖 +portion&filesystem namespace&AGGREGATION +HDFS Federation&cluster&依赖 +HDFS Federation&scale&依赖 +filesystem namespace&namespace&GENERALIZATION +HDFS Federation&cluster&依赖 +HDFS Federation&scale&依赖 +one namenode&file&依赖 +one namenode&file&依赖 +second namenode&/ share&依赖 +second namenode&file&依赖 +namenode&one another&依赖 +failure&one namenode&AGGREGATION +availability&namespace&AGGREGATION +failure&namespace&依赖 +failure&availability&依赖 +so datanodes register&multiple block pool&依赖 +so datanodes register&multiple block pool&依赖 +so datanodes register&namenode&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&multiple block pool&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&multiple block pool&依赖 +so datanodes register&namenode&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&namenode&依赖 +so datanodes register&namenode&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&cluster and store block&依赖 +so datanodes register&cluster and store block&依赖 +sole repository&metada&AGGREGATION +clients —&list file&依赖 +clients —&list file&依赖 +namenode&metada&依赖 +single point failure ( spof )&failure ( spof )&AGGREGATION +namenode&failure ( spof )&依赖 +whole Hadoop system&event&依赖 +administrator&new primary namenode&依赖 +administrator&filesystem metadata replica&依赖 +one&filesystem metadata replica&AGGREGATION +administrator&one&依赖 +new namenode&request&依赖 +its&image& +its&log& +ii )&block report&依赖 +it&memory&依赖 +it&namespace image&依赖 +it&namenode&依赖 +time&large cluster&依赖 +time&large cluster&依赖 +time&many files and block&依赖 +time&many files and block&依赖 +0.23 release series&situation&依赖 +0.23 release series&hadoop remedy&AGGREGATION +pair&implementation&依赖 +pair&implementation&依赖 +pair&implementation&依赖 +pair&implementation&依赖 +pair&namenode&AGGREGATION +standby&duty&依赖 +its&duties& +failure&active namenode&AGGREGATION +event&failure&AGGREGATION +namenode&highly-available shared storage&依赖 +namenode&memory& +datanode&namenode&依赖 +block mapping&’s memory&依赖 +datanode&block report&依赖 +namenode failover&mechanism&依赖 +transition&system&依赖 +transition&new entity&依赖 +first implementation&ZooKeeper&依赖 +case&routine maintenance&AGGREGATION +Failover&adminstrator&依赖 +Failover&routine maintenance&依赖 +Failover&example&依赖 +Failover&case&依赖 +failover controller&role&依赖 +failover controller&orderly transition&依赖 +failover controller&both namenode&依赖 +case&ungraceful failover&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt new file mode 100644 index 0000000..3853475 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt @@ -0,0 +1,36 @@ +HDFS +When a dataset outgrows the storage capacity of a single physical machine, it becomes necessary to partition it across a number of separate machines. Filesystems that manage the storage across a network of machines are called distributed filesystems. +Hadoop comes with a distributed filesystem called HDFS, which stands for Hadoop Distributed Filesystem. +The Design of HDFS : +HDFS is a filesystem designed for storing very large files with streaming data access patterns, running on clusters of commodity hardware. +Very large files: +“Very large” in this context means files that are hundreds of megabytes, gigabytes, or terabytes in size. There are Hadoop clusters running today that store petabytes of data. +Streaming data access : +HDFS is built around the idea that the most efficient data processing pattern is a write-once, read-many-times pattern. A dataset is typically generated or copied from source, then various analyses are performed on that dataset over time. +Commodity hardware : +Hadoop doesn’t require expensive, highly reliable hardware to run on. It’s designed to run on clusters of commodity hardware (commonly available hardware available from multiple vendors3) for which the chance of node failure across the cluster is high, at least for large clusters. HDFS is designed to carry on working without a noticeable interruption to the user in the face of such failure. +These are areas where HDFS is not a good fit today: +Low-latency data access : +Applications that require low-latency access to data, in the tens of milliseconds range, will not work well with HDFS. +Lots of small files : +Since the namenode holds filesystem metadata in memory, the limit to the number of files in a filesystem is governed by the amount of memory on the namenode. +Multiple writers, arbitrary file modifications: +Files in HDFS may be written to by a single writer. Writes are always made at the end of the file. There is no support for multiple writers, or for modifications at arbitrary offsets in the file. +HDFS Concepts +Blocks: +HDFS has the concept of a block, but it is a much larger unit—64 MB by default. Files in HDFS are broken into block-sized chunks, which are stored as independent units. +Having a block abstraction for a distributed filesystem brings several benefits.: +The first benefit : +A file can be larger than any single disk in the network. There’s nothing that requires the blocks from a file to be stored on the same disk, so they can take advantage of any of the disks in the cluster. +Second: +Making the unit of abstraction a block rather than a file simplifies the storage subsystem. The storage subsystem deals with blocks, simplifying storage management (since blocks are a fixed size, it is easy to calculate how many can be stored on a given disk) and eliminating metadata concerns. +Third: +Blocks fit well with replication for providing fault tolerance and availability. To insure against corrupted blocks and disk and machine failure, each block is replicated to a small number of physically separate machines (typically three). +Why Is a Block in HDFS So Large? +HDFS blocks are large compared to disk blocks, and the reason is to minimize the cost of seeks. By making a block large enough, the time to transfer the data from the disk can be made to be significantly larger than the time to seek to the start of the block. Thus the time to transfer a large file made of multiple blocks operates at the disk transfer rate. +A quick calculation shows that if the seek time is around 10 ms, and the transfer rate is 100 MB/s, then to make the seek time 1% of the transfer time, we need to make the block size around 100 MB. The default is actually 64 MB, although many HDFS installations use 128 MB blocks. This figure will continue to be revised upward as transfer speeds grow with new generations of disk drives. +Namenodes and Datanodes: +An HDFS cluster has two types of node operating in a master-worker pattern: a namenode (the master) and a number of datanodes (workers). The namenode manages the filesystem namespace. It maintains the filesystem tree and the metadata for all the files and directories in the tree. This information is stored persistently on the local disk in the form of two files: the namespace image and the edit log. The namenode also knows the datanodes on which all the blocks for a given file are located. +Apache Hadoop is designed to have Master Slave architecture: Master: Namenode, JobTracker Slave: {DataNode, TaskTraker}, ….. {DataNode, TaskTraker} HDFS is one primary components of Hadoop cluster and HDFS is designed to have Master-slave architecture. Master: NameNode Slave: {Datanode}…..{Datanode} - The Master (NameNode) manages the file system namespace operations like opening, closing, and renaming files and directories and determines the mapping of blocks to DataNodes along with regulating access to files by clients - Slaves (DataNodes) are responsible for serving read and write requests from the file system’s clients along with perform block creation, deletion, and replication upon instruction from the Master (NameNode). Datanodes are the workhorses of the filesystem. They store and retrieve blocks when they are told to (by clients or the namenode), and they report back to the namenode periodically with lists of blocks that they are storing. NameNode failure: if the machine running the namenode failed, all the files on the filesystem would be lost since there would be no way of knowing how to reconstruct the files from the blocks on the datanodes. What precautions HDFS is taking to recover file system in case of namenode failure: The first way is to back up the files that make up the persistent state of the filesystem metadata. Hadoop can be configured so that the namenode writes its persistent state to multiple filesystems. These writes are synchronous and atomic. The usual configuration choice is to write to local disk as well as a remote NFS mount. +Second way: It is also possible to run a secondary namenode, which despite its name does not act as a namenode. Its main role is to periodically merge the namespace image with the edit log to prevent the edit log from becoming too large. But this can shaped to act as primary namenode. HDFS Federation : The namenode keeps a reference to every file and block in the filesystem in memory, which means that on very large clusters with many files, memory becomes the limiting factor for scaling . HDFS Federation, introduced in the 0.23 release series, allows a cluster to scale by adding namenodes, each of which manages a portion of the filesystem namespace. For example, one namenode might manage all the files rooted under /user, say, and a second namenode might handle files under /share. Each Namenode Namespace volumes are independent of each other, which means namenodes do not communicate with one another, and furthermore the failure of one namenode does not affect the availability of the namespaces managed by other namenodes. Block pool storage is not partitioned, however, so datanodes register with each namenode in the cluster and store blocks from multiple block pools. HDFS High-Availability: The namenode is still a single point of failure (SPOF), since if it did fail, all clients—including MapReduce jobs—would be unable to read, write, or list files, because the namenode is the sole repository of the metadata and the file-to-block mapping. In such an event the whole Hadoop system would effectively be out of service until a new namenode could be brought online. To recover from a failed namenode in this situation, an administrator starts a new primary namenode with one of the filesystem metadata replicas, and configures datanodes and clients to use this new namenode. The new namenode is not able to serve requests until it has i) loaded its namespace image into memory, ii) replayed its edit log, and iii) received enough block reports from the datanodes to leave safe mode. On large clusters with many files and blocks, the time it takes for a namenode to start from cold can be 30 minutes or more. The 0.23 release series of Hadoop remedies this situation by adding support for HDFS high-availability (HA). In this implementation there is a pair of namenodes in an activestandby configuration. In the event of the failure of the active namenode, the standby takes over its duties to continue servicing client requests without a significant interruption. A few architectural changes are needed to allow this to happen:  The namenodes must use highly-available shared storage to share the edit log. + Datanodes must send block reports to both namenodes since the block mappings are stored in a namenode’s memory, and not on disk.  Clients must be configured to handle namenode failover, which uses a mechanism that is transparent to users. Failover and fencing: The transition from the active namenode to the standby is managed by a new entity in the system called the failover controller. Failover controllers are pluggable, but the first implementation uses ZooKeeper to ensure that only one namenode is active. Failover may also be initiated manually by an adminstrator, in the case of routine maintenance, for example. This is known as a graceful failover, since the failover controller arranges an orderly transition for both namenodes to switch roles. In the case of an ungraceful failover, The HA implementation goes to great lengths to ensure that the previously active namenode is prevented from doing any damage and causing corruption—a method known as fencing. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/HDFS.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..a11c1e626af77bcce485b28b67ae14d5153560ec GIT binary patch literal 29184 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 Tes;y@&j06BzbgH|?t%XU{X{%) literal 0 HcmV?d00001 diff --git "a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer-relation.txt" "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer-relation.txt" new file mode 100644 index 0000000..7849dd7 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer-relation.txt" @@ -0,0 +1,258 @@ +file system ( hdf ) architecture –&Guide&依赖 +every datum engineer download share aniruddha bhandari — october 28 , 2020 beginner big datum data engineering hadoop overview&Components&依赖 +every datum engineer download share aniruddha bhandari — october 28 , 2020 beginner big datum data engineering hadoop overview&HDFS&依赖 +Components&HDFS&AGGREGATION +massive amount&datum&AGGREGATION +your&Tweet& +you&next Tweet&依赖 +your&message& +you&step&依赖 +you&technology&依赖 +you&datum&依赖 +you&datum&依赖 +it&single machine&依赖 +you&lovely 3 AM tweets * cough *&依赖 +your&*& +I&thinking& +you&storage component&依赖 +you&Hadoop&依赖 +you&file system ( hdf&依赖 +your&side& +storage component&Hadoop&AGGREGATION +you&amazing power&依赖 +you&file system ( hdf&依赖 +you&Hadoop&依赖 +you&storage component&依赖 +you&amazing power&依赖 +you&storage component&依赖 +amazing power&file system ( hdf&AGGREGATION +you&Hadoop&依赖 +you&amazing power&依赖 +you&file system ( hdf&依赖 +It&Hadoop&依赖 +most important component&Hadoop&AGGREGATION +its&components& +we&article&依赖 +file system ( hdf&what&依赖 +table&Contents&AGGREGATION +component&hdf&AGGREGATION +HDFS Replication Management Replication&Blocks&AGGREGATION +huge volume&datum&AGGREGATION +It&datum&依赖 +It&huge volume&依赖 +It&single machine&依赖 +it&datum&依赖 +multiple machine&storage&依赖 +network&machine&AGGREGATION +file system ( hdf )&Hadoop&依赖 +datum&machine&依赖 +datum&distributed manner&依赖 +cluster&machine&AGGREGATION +datum&cluster&依赖 +few property&existence&依赖 +its&existence& +it&few property&依赖 +petabyte&datum&AGGREGATION +philosophy&most effective data processing pattern&依赖 +It&philosophy&依赖 +Cost-effective – hdf&commodity hardware&依赖 +cluster&commodity hardware&AGGREGATION +Cost-effective – hdf&cluster&依赖 +component&file system ( hdf )&AGGREGATION +hdf&two main component&依赖 +– data blocks and node&data block&依赖 +hdf break&file&依赖 +hdf break&file&依赖 +it&them&依赖 +smaller unit&hdf&依赖 +you&it&依赖 +size&default&依赖 +size&default&依赖 +you&requirement&依赖 +file&size 512MB&AGGREGATION +you&file&依赖 +you&size 512MB&依赖 +it&128MB each&依赖 +it&4 block&依赖 +file&size 524MB&AGGREGATION +you&size 524MB&依赖 +it&5 block&依赖 +4&128MB each&依赖 +5th&12MB&依赖 +last block&disk&依赖 +last block&complete 128MB&依赖 +multiple block&10KB&AGGREGATION +amount&petra byte&依赖 +we&Hadoop&依赖 +we&amount&依赖 +we&datum&依赖 +order&petra byte&AGGREGATION +amount&petra byte&依赖 +amount&datum&AGGREGATION +we&block&依赖 +we&small size&依赖 +colossal number&block&AGGREGATION +block&small size&AGGREGATION +block&lot&依赖 +block&overhead&依赖 +location&block&AGGREGATION +lot&overhead&AGGREGATION +it&it&依赖 +choke&single machine&AGGREGATION +It&proper spread&依赖 +It&workload&依赖 +proper spread&workload&AGGREGATION +they&block&依赖 +Namenode&master-worker architecture&依赖 +Namenode&master-worker architecture&依赖 +filesystem tree or hierarchy&files and directory&AGGREGATION +owner&file&AGGREGATION +It&file&依赖 +It&location&依赖 +block&file&AGGREGATION +It&block&依赖 +their&size& +information&two file&依赖 +information&form&依赖 +information&Fsimage&依赖 +information&local disk&依赖 +form&two file&AGGREGATION +fsimage store&information&依赖 +fsimage store&filesystem&依赖 +fsimage store&information&依赖 +fsimage store&filesystem&依赖 +fsimage store&information&依赖 +fsimage store&filesystem&依赖 +fsimage store&filesystem&依赖 +fsimage store&filesystem&依赖 +fsimage store&information&依赖 +fsimage store&information&依赖 +fsimage store&information&依赖 +fsimage store&filesystem&依赖 +it&replication level&依赖 +it&file&依赖 +their&sizes& +it&directory&依赖 +it&modification time and permission&依赖 +Edit log&write operation&依赖 +Edit log&track&依赖 +client&that&依赖 +track&write operation&AGGREGATION +Edit log&write operation&依赖 +Edit log&track&依赖 +client&hdf&依赖 +it&Namenode&依赖 +client&information&依赖 +Namenode&block&依赖 +Namenode&location&依赖 +Namenode&location&依赖 +Namenode&block&依赖 +Namenode&block&依赖 +datanode&deletion , etc.&依赖 +datanode&block&依赖 +They&Namenode&依赖 +their&health& +They&heartbeat&依赖 +it&health&依赖 +Namenode&block&依赖 +list&block&AGGREGATION +mapping&block&AGGREGATION +Namenode&mapping&依赖 +Namenode&block&依赖 +Namenode&mapping&依赖 +DataNode&list&依赖 +Namenode&block&依赖 +DataNode&block&依赖 +Namenode&mapping&依赖 +its&memory& +node&addition&依赖 +node&node&依赖 +node&node&依赖 +node&cluster&依赖 +node&addition&依赖 +node&cluster&依赖 +two type&node&AGGREGATION +node&two type&依赖 +node&two type&依赖 +case&failure&AGGREGATION +latest copy&Edit Log&AGGREGATION +we&Edit Log&依赖 +we&latest copy&依赖 +track&transaction&AGGREGATION +we&long time&依赖 +Edit log&size&依赖 +we&node&依赖 +lot&time&AGGREGATION +filesystem&time&依赖 +we&Secondary Namenode&依赖 +Secondary Namenode&Namenode&GENERALIZATION +check‐points&’s in-memory file system metada&AGGREGATION +whose main task&Edit log&依赖 +primary&metadata& +Secondary Namenode&cluster&依赖 +whose&task& +lot&memory&AGGREGATION +Secondary namenode&separate node&依赖 +Secondary namenode&cluster&依赖 +Secondary Namenode&Namenode&依赖 +Secondary Namenode&name&依赖 +its&name& +It&Checkpointing&依赖 +copy&latest Fsimage&AGGREGATION +replication&block&AGGREGATION +one&HDFS&依赖 +one&block&依赖 +one&block&依赖 +one&best feature&AGGREGATION +one&block&依赖 +best feature&hdf&AGGREGATION +one&HDFS&依赖 +one&HDFS&依赖 +it&them&依赖 +it&block&依赖 +’s&question&依赖 +reliable storage component&Hadoop&AGGREGATION +Replication&blocks hdf&AGGREGATION +Replication&Hadoop&依赖 +Replication&Hadoop&依赖 +block&cluster&依赖 +block&different Data node&依赖 +two more copy&it&AGGREGATION +we&much storage&依赖 +5 block&128MB each&AGGREGATION +we&128MB each&依赖 +we&5 block&依赖 +more&machine&AGGREGATION +We&cluster&依赖 +do namenode&replica&依赖 +we&Rack&依赖 +we&look&依赖 +we&Hadoop&依赖 +Rack&machine&依赖 +collection&machine&AGGREGATION +Rack&30-40&依赖 +Rack&hadoop )&依赖 +Rack awareness Replica storage&reliability and read/write bandwidth&依赖 +we&fault tolerance&依赖 +replica&same node&依赖 +Hadoop&deal&依赖 +Hadoop&default strategy&依赖 +first replica&example&依赖 +client&same Datanode&依赖 +first replica&same Datanode&依赖 +second replica&different Datanode&依赖 +third replica&different Datanode&依赖 +third replica&same rack&依赖 +third replica&second&依赖 +subsequent replica&random Data node&依赖 +subsequent replica&cluster&依赖 +I&solid understanding&依赖 +it&datum&依赖 +I&what&依赖 +file system ( hdf )&what&依赖 +better understanding&Hadoop&AGGREGATION +I&Hadoop&依赖 +Definitive Guide&Guide&GENERALIZATION +I&Definitive Guide&依赖 +MapReduce Types&Tables&AGGREGATION +article&it&依赖 diff --git "a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt" "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt" new file mode 100644 index 0000000..34635b3 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt" @@ -0,0 +1,161 @@ +Hadoop Distributed File System (HDFS) Architecture – A Guide to HDFS for Every Data Engineer +download +Share +Aniruddha Bhandari — October 28, 2020 +Beginner Big data Data Engineering Hadoop +Overview +Get familiar with Hadoop Distributed File System (HDFS) +Understand the Components of HDFS + + +Introduction +In contemporary times, it is commonplace to deal with massive amounts of data. From your next WhatsApp message to your next Tweet, you are creating data at every step when you interact with technology. Now multiply that by 4.5 billion people on the internet – the math is simply mind-boggling! + +But ever wondered how to handle such data? Is it stored on a single machine? What if the machine fails? Will you lose your lovely 3 AM tweets *cough*? + + + +The answer is No. I am pretty sure you are already thinking about Hadoop. Hadoop is an amazing framework. With Hadoop by your side, you can leverage the amazing powers of Hadoop Distributed File System (HDFS)-the storage component of Hadoop. It is probably the most important component of Hadoop and demands a detailed explanation. + +So, in this article, we will learn what Hadoop Distributed File System (HDFS) really is and about its various components. Also, we will see what makes HDFS tick – that is what makes it so special. Let’s find out! + + + +Table of Contents +What is Hadoop Distributed File System (HDFS)? +What are the components of HDFS? +Blocks in HDFS? +Namenode in HDFS +Datanodes in HDFS +Secondary Node in HDFS +Replication Management +Replication of Blocks +What is a Rack in Hadoop? +Rack Awareness + + +What is Hadoop Distributed File System(HDFS)? +It is difficult to maintain huge volumes of data in a single machine. Therefore, it becomes necessary to break down the data into smaller chunks and store it on multiple machines. + +Filesystems that manage the storage across a network of machines are called distributed file systems. + +Hadoop Distributed File System (HDFS) is the storage component of Hadoop. All data stored on Hadoop is stored in a distributed manner across a cluster of machines. But it has a few properties that define its existence. + +Huge volumes – Being a distributed file system, it is highly capable of storing petabytes of data without any glitches. +Data access – It is based on the philosophy that “the most effective data processing pattern is write-once, the read-many-times pattern”. +Cost-effective – HDFS runs on a cluster of commodity hardware. These are inexpensive machines that can be bought from any vendor. + + +What are the components of the Hadoop Distributed File System(HDFS)? +HDFS has two main components, broadly speaking, – data blocks and nodes storing those data blocks. But there is more to it than meets the eye. So, let’s look at this one by one to get a better understanding. + +HDFS Blocks +HDFS breaks down a file into smaller units. Each of these units is stored on different machines in the cluster. This, however, is transparent to the user working on HDFS. To them, it seems like storing all the data onto a single machine. + +These smaller units are the blocks in HDFS. The size of each of these blocks is 128MB by default, you can easily change it according to requirement. So, if you had a file of size 512MB, it would be divided into 4 blocks storing 128MB each. + +hadoop hdfs blocks + +If, however, you had a file of size 524MB, then, it would be divided into 5 blocks. 4 of these would store 128MB each, amounting to 512MB. And the 5th would store the remaining 12MB. That’s right! This last block won’t take up the complete 128MB on the disk. + +hadoop hdfs blocks split + +But, you must be wondering, why such a huge amount in a single block? Why not multiple blocks of 10KB each? Well, the amount of data with which we generally deal with in Hadoop is usually in the order of petra bytes or higher. + +Therefore, if we create blocks of small size, we would end up with a colossal number of blocks. This would mean we would have to deal with equally large metadata regarding the location of the blocks which would just create a lot of overhead. And we don’t really want that! + +There are several perks to storing data in blocks rather than saving the complete file. + +The file itself would be too large to store on any single disk alone. Therefore, it is prudent to spread it across different machines on the cluster. +It would also enable a proper spread of the workload and prevent the choke of a single machine by taking advantage of parallelism. +Now, you must be wondering, what about the machines in the cluster? How do they store the blocks and where is the metadata stored? Let’s find out. + + + +Namenode in HDFS +HDFS operates in a master-worker architecture, this means that there are one master node and several worker nodes in the cluster. The master node is the Namenode. + +Namenode is the master node that runs on a separate node in the cluster. + +Manages the filesystem namespace which is the filesystem tree or hierarchy of the files and directories. +Stores information like owners of files, file permissions, etc for all the files. +It is also aware of the locations of all the blocks of a file and their size. +All this information is maintained persistently over the local disk in the form of two files: Fsimage and Edit Log. + +Fsimage stores the information about the files and directories in the filesystem. For files, it stores the replication level, modification and access times, access permissions, blocks the file is made up of, and their sizes. For directories, it stores the modification time and permissions. +Edit log on the other hand keeps track of all the write operations that the client performs. This is regularly updated to the in-memory metadata to serve the read requests. +Whenever a client wants to write information to HDFS or read information from HDFS, it connects with the Namenode. The Namenode returns the location of the blocks to the client and the operation is carried out. + +Yes, that’s right, the Namenode does not store the blocks. For that, we have separate nodes. + + + +Datanodes in HDFS +Datanodes are the worker nodes. They are inexpensive commodity hardware that can be easily added to the cluster. + +Datanodes are responsible for storing, retrieving, replicating, deletion, etc. of blocks when asked by the Namenode. + +They periodically send heartbeats to the Namenode so that it is aware of their health. With that, a DataNode also sends a list of blocks that are stored on it so that the Namenode can maintain the mapping of blocks to Datanodes in its memory. + +But in addition to these two types of nodes in the cluster, there is also another node called the Secondary Namenode. Let’s look at what that is. + + + +Secondary Namenode in HDFS +Suppose we need to restart the Namenode, which can happen in case of a failure. This would mean that we have to copy the Fsimage from disk to memory. Also, we would also have to copy the latest copy of Edit Log to Fsimage to keep track of all the transactions. But if we restart the node after a long time, then the Edit log could have grown in size. This would mean that it would take a lot of time to apply the transactions from the Edit log. And during this time, the filesystem would be offline. Therefore, to solve this problem, we bring in the Secondary Namenode. + +Secondary Namenode is another node present in the cluster whose main task is to regularly merge the Edit log with the Fsimage and produce check‐points of the primary’s in-memory file system metadata. This is also referred to as Checkpointing. + +hadop hdfs checkpointing + + + +But the checkpointing procedure is computationally very expensive and requires a lot of memory, which is why the Secondary namenode runs on a separate node on the cluster. + +However, despite its name, the Secondary Namenode does not act as a Namenode. It is merely there for Checkpointing and keeping a copy of the latest Fsimage. + + + +Replication Management in HDFS +Now, one of the best features of HDFS is the replication of blocks which makes it very reliable. But how does it replicate the blocks and where does it store them? Let’s answer those questions now. + + + +Replication of blocks +HDFS is a reliable storage component of Hadoop. This is because every block stored in the filesystem is replicated on different Data Nodes in the cluster. This makes HDFS fault-tolerant. + +The default replication factor in HDFS is 3. This means that every block will have two more copies of it, each stored on separate DataNodes in the cluster. However, this number is configurable. + +hadoop hdfs replication + + + +But you must be wondering doesn’t that mean that we are taking up too much storage. For instance, if we have 5 blocks of 128MB each, that amounts to 5*128*3 = 1920 MB. True. But then these nodes are commodity hardware. We can easily scale the cluster to add more of these machines. The cost of buying machines is much lower than the cost of losing the data! + +Now, you must be wondering, how does Namenode decide which Datanode to store the replicas on? Well, before answering that question, we need to have a look at what is a Rack in Hadoop. + + + +What is a Rack in Hadoop? +A Rack is a collection of machines (30-40 in Hadoop) that are stored in the same physical location. There are multiple racks in a Hadoop cluster, all connected through switches. + +rack + +Rack awareness +Replica storage is a tradeoff between reliability and read/write bandwidth. To increase reliability, we need to store block replicas on different racks and Datanodes to increase fault tolerance. While the write bandwidth is lowest when replicas are stored on the same node. Therefore, Hadoop has a default strategy to deal with this conundrum, also known as the Rack Awareness algorithm. + +For example, if the replication factor for a block is 3, then the first replica is stored on the same Datanode on which the client writes. The second replica is stored on a different Datanode but on a different rack, chosen randomly. While the third replica is stored on the same rack as the second but on a different Datanode, again chosen randomly. If, however, the replication factor was higher, then the subsequent replicas would be stored on random Data Nodes in the cluster. + + rack awareness + + + +Endnotes +I hope by now you have got a solid understanding of what Hadoop Distributed File System(HDFS) is, what are its important components, and how it stores the data. There are however still a few more concepts that we need to cover with respect to Hadoop Distributed File System(HDFS), but that is a story for another article. + +For now, I recommend you go through the following articles to get a better understanding of Hadoop and this Big Data world! + +Hadoop Ecosystem +Introduction to MapReduce +Types of Tables in Apache Hive +Last but not the least, I recommend reading Hadoop: The Definitive Guide by Tom White. This article was highly inspired by it. \ No newline at end of file diff --git "a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt.xml.xls" "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop Distributed File System (HDFS) Architecture \342\200\223 A Guide to HDFS for Every Data Engineer.txt.xml.xls" new file mode 100644 index 0000000000000000000000000000000000000000..b5dfeed6371384b0b5746dc922d01952eb726c61 GIT binary patch literal 35328 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⫬!YmjD7pSrsLeZX>A(RVIM$gU=3dc6X@ho$u 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 z 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 oPo8Cs?z&0zXm= pairs, shuffle the resulting data (transfer data to the reducers), then reduce over all pairs with the same key. + +The top-level unit of work in MapReduce is a job. Each job is composed of one or more map or reduce tasks. + +The canonical example of a MapReduce job is counting word frequencies in a body of text. The image below illustrates such an example: + +Hadoop architecture - MapReduce word frequency flow diagram +Key differences between versions +In earlier versions of Hadoop (pre-2.0), MapReduce took care of its own resource allocation and job scheduling as well as the actual computation. + +Newer versions of Hadoop (2.0+) decouple the scheduling from the computation with YARN, which handles the allocation of computational resources for MapReduce jobs. This allows other processing frameworks (see below) to share the cluster without resource contention. + +Other frameworks +Though Hadoop comes with MapReduce out of the box, a number of computing frameworks have been developed for or adapted to the Hadoop ecosystem. Among the more popular are Apache Spark and Apache Tez. This article series will focus on MapReduce as the compute framework. + +Untangling YARN +YARN (Yet Another Resource Negotiator) is the framework responsible for assigning computational resources for application execution. + +Hadoop architecture - YARN architecture diagram +YARN consists of three core components: + +ResourceManager (one per cluster) +ApplicationMaster (one per application) +NodeManagers (one per node) +Caution, overloaded terms ahead +YARN uses some very common terms in uncommon ways. For example, when most people hear “container”, they think Docker. In the Hadoop ecosystem, it takes on a new meaning: a Resource Container (RC) represents a collection of physical resources. It is an abstraction used to bundle resources into distinct, allocatable units. + +“Application” is another overloaded term—in YARN, an application represents a set of tasks that are to be executed together. Application in YARN is synonymous with MapReduce’s job concept. + +ResourceManager +The ResourceManager is the rack-aware leader node in YARN. It is responsible for taking inventory of available resources and runs several critical services, the most important of which is the Scheduler. + +Scheduler +The Scheduler component of the YARN ResourceManager allocates resources to running applications. It is a pure scheduler in that it does not monitor or track application status or progress. As it performs no monitoring, it cannot guarantee that tasks will restart should they fail. + +As of Hadoop 2.7.2, YARN supports several scheduler policies: the CapacityScheduler, the FairScheduler, and the FIFO (first in first out) Scheduler. The default scheduler varies by Hadoop distribution, but no matter the policy used, the Scheduler allocates resources by assigning containers (bundles of physical resources) to the requesting ApplicationMaster. + +ApplicationMaster +Each application running on Hadoop has its own dedicated ApplicationMaster instance. This instance lives in its own, separate container on one of the nodes in the cluster. Each application’s ApplicationMaster periodically sends heartbeat messages to the ResourceManager, as well as requests for additional resources, if needed. Additional resources are granted by the ResourceManager through the assignment of Container Resource leases, which serve as reservations for containers on NodeManagers. + +The ApplicationMaster oversees the execution of an application over its full lifespan, from requesting additional containers from the ResourceManger, to submitting container release requests to the NodeManager. + +NodeManagers +The NodeManager is a per-node agent tasked with overseeing containers throughout their lifecycles, monitoring container resource usage, and periodically communicating with the ResourceManager. + +Conceptually, NodeManagers are much like TaskTrackers in earlier versions of Hadoop. Whereas TaskTrackers used a fixed number of map and reduce slots for scheduling, NodeManagers have a number of dynamically created, arbitrarily-sized Resource Containers (RCs). Unlike slots in MR1, RCs can be used for map tasks, reduce tasks, or tasks from other frameworks. + +Executing applications with YARN +Hadoop architecture - YARN application execution diagram +Typical application execution with YARN follows this flow: + +Client program submits the MapReduce application to the ResourceManager, along with information to launch the application-specific ApplicationMaster. +ResourceManager negotiates a container for the ApplicationMaster and launches the ApplicationMaster. +ApplicationMaster boots and registers with the ResourceManager, allowing the original calling client to interface directly with the ApplicationMaster. +ApplicationMaster negotiates resources (resource containers) for client application. +ApplicationMaster gives the container launch specification to the NodeManager, which launches a container for the application. +During execution, client polls ApplicationMaster for application status and progress. +Upon completion, ApplicationMaster deregisters with the ResourceManager and shuts down, returning its containers to the resource pool. +ZooKeeper +Apache ZooKeeper is a popular tool used for coordination and synchronization of distributed systems. Since Hadoop 2.0, ZooKeeper has become an essential service for Hadoop clusters, providing a mechanism for enabling high-availability of former single points of failure, specifically the HDFS NameNode and YARN ResourceManager. + +HDFS and ZooKeeper +Hadoop architecture - NameNode HA with ZooKeeper diagram +In previous versions of Hadoop, the NameNode represented a single point of failure—should the NameNode fail, the entire HDFS cluster would become unavailable as the metadata containing the file-to-block mappings would be lost. + +Hadoop 2.0 brought many improvements, among them a high-availability NameNode service. When ZooKeeper is used in conjunction with QJM or NFS, it enables automatic failover. + +Automatic NameNode failover requires two components: a ZooKeeper quorum, and a ZKFailoverController (ZKFC) process running on each NameNode. The NameNode and Standby NameNodes maintain persistent sessions in ZooKeeper, with the NameNode holding a special, ephemeral “lock” znode (the equivalent of a file or directory, in a regular file system); if the NameNode does not maintain contact with the ZooKeeper ensemble, its session is expired, triggering a failover (handled by ZKFC). + +ZKFailoverController is a process that runs alongside the NameNode and Standby NameNodes, periodically checking the health of the node it is running on. On healthy nodes, ZKFC will try to acquire the lock znode, succeeding if no other node holds the lock (which means the primary NameNode has failed). Once the lock is acquired, the new NameNode transitions to the active NameNode. + +YARN and ZooKeeper +Hadoop architecture - ResourceManager HA with ZooKeeper diagram +When YARN was initially created, its ResourceManager represented a single point of failure—if NodeManagers lost contact with the ResourceManager, all jobs in progress would be halted, and no new jobs could be assigned. + +Hadoop 2.4 improved YARN’s resilience with the release of the ResourceManager high-availability feature. The new feature incorporates ZooKeeper to allow for automatic failover to a standby ResourceManager in the event of the primary’s failure. + +Like HDFS, YARN uses a similar, ZooKeeper-managed lock to ensure only one ResourceManager is active at once. Unlike HDFS, YARN’s automatic failover mechanism does not run as a separate process—instead, its ActiveStandbyElector service is part of the ResourceManager process itself. Like ZKFailoverController, the ActiveStandbyElector service on each ResourceManager continuously vies for control of an ephemeral znode, ActiveStandbyElectorLock. Because the node is ephemeral, if the currently active RM allows the session to expire, the RM that successfully acquires a lock on the ActiveStandbyElectorLock will automatically be promoted to the active state. + +From theory, to practice +In this post, we’ve explored all the core components found in a standard Hadoop cluster. + +Read on to the next article in this series for an examination of Hadoop’s key performance metrics and health indicators. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop architectural overview.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..cc7d5d602764c95dce4b84b3f1d7fc495c5527bc GIT binary patch literal 50688 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 literal 0 HcmV?d00001 diff --git "a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory-relation.txt" "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory-relation.txt" new file mode 100644 index 0000000..eeb4d17 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory-relation.txt" @@ -0,0 +1,152 @@ +Hadoop cluster&kove ® xpd ™ persistent memory&依赖 +Hadoop cluster&kove ® xpd ™ persistent memory&依赖 +its&information& +Hadoop cluster&NameNode server&依赖 +failure and source&data loss&AGGREGATION +Hadoop cluster&most vital information&依赖 +Hadoop cluster&RAM&依赖 +potential point&failure and source&AGGREGATION +its&server& +usual precaution&form&依赖 +datum&case&依赖 +its&operation& +datum&failure&依赖 +case&failure&AGGREGATION +it&many hour&依赖 +one&hadoop functionality&依赖 +one&hadoop functionality&依赖 +one&fast restoration&依赖 +one&fast restoration&依赖 +one&fast restoration&依赖 +fast restoration&hadoop functionality&AGGREGATION +one&fast restoration&依赖 +one&hadoop functionality&依赖 +Hadoop NameNode&NameNode&GENERALIZATION +one&hadoop functionality&依赖 +Hadoop software&NameNode&依赖 +Hadoop software&memory space&依赖 +Hadoop software&memory space&依赖 +modified version&Hadoop software&AGGREGATION +memory space&NameNode&AGGREGATION +Hadoop software&NameNode&依赖 +Standard RAM&yet another limitation&依赖 +Standard RAM&Hadoop&依赖 +Standard RAM&RAM&GENERALIZATION +it&size&依赖 +One&file&依赖 +One&much datum&依赖 +Kove XPD&size&依赖 +removal&limitation&AGGREGATION +Kove XPD&contrast&依赖 +its&block& +sake&efficiency&AGGREGATION +it&failure&依赖 +single point&failure&AGGREGATION +prospect&persistent memory&依赖 +prospect&NameNode&依赖 +advantage&implementation&AGGREGATION +power failure&failure&GENERALIZATION +Persistent memory&power failure&依赖 +device&terabyte&依赖 +size&Kove memory&AGGREGATION +NameNode&more information&依赖 +NameNode&much memory&依赖 +number&file&AGGREGATION +diagram below&thought&依赖 +our&thoughts& +summary&approach&AGGREGATION +our&approaches& +we&major actor&依赖 +structure&FSImage structure INode&依赖 +structure&INode&依赖 +structure&CorruptReplicasMap and recentInvalidateSets and PendingBlockInfo and ExcessReplicateMap and PendingReplicationBlocks and UnderReplicatedBlocks&依赖 +structure&interest&AGGREGATION +new list&block&AGGREGATION +/ /&block&依赖 +/ /&new list&依赖 +/ /&new list&依赖 +/ /&block&依赖 +possible way&usage&依赖 +possible way&special buffer&依赖 +usage&special buffer&AGGREGATION +Registration&time (&依赖 +Registration&100 microsecond&依赖 +we&4 way&依赖 +we&it&依赖 +buffer&start&依赖 +cost&data transfer to/from other memory area&AGGREGATION +start&NameNode&AGGREGATION +buffer&NameNode&依赖 +different chunk&datum&AGGREGATION +buffer&time&依赖 +combination&a ) and ( b )&AGGREGATION +we&Kove&依赖 +we&it&依赖 +we&place and transfer&依赖 +area&interest&AGGREGATION +we&buffer&依赖 +May&additional code&依赖 +May&deal&依赖 +May&caching&依赖 +overhead&what&依赖 +Easiest to implement&library created buffer&依赖 +we&NameNode change&实现 +we&NameNode change&实现 +we&EHCache library&实现 +we&EHCache library&实现 +your&database& +We&it&依赖 +implementation&github here and https://github.com/markkerzner/nn_kove&依赖 +combination&teragen/terasort&AGGREGATION +testing&use nnbench&依赖 +testing&use nnbench&依赖 +result&run&AGGREGATION +performance&cluster&AGGREGATION +50 %&in-memory Hadoop code&AGGREGATION +KDSA block device&block device&GENERALIZATION +initial prototype&Kove XPD&依赖 +our&prototype& +initial prototype&KDSA block device&依赖 +block device&device&GENERALIZATION +performance&block device&AGGREGATION +proper way&direct write&依赖 +C interface&performance&依赖 +proper way&Java&依赖 +C interface&block device&依赖 +we&more meticulous implementation&依赖 +four group&test result&AGGREGATION +slots_millis_maps =&6462&依赖 +Launched map task&2&依赖 +slots_millis_reduces =&9238&依赖 +Bytes Read&= 50000000&依赖 +File&Counters& +file_bytes_read =&51000264&依赖 +hdfs_bytes_read =&50000218&依赖 +file_bytes_written =&102164352&依赖 +hdfs_bytes_written =&50000000&依赖 +spill records = 1000000&spill records = 1000000&依赖 +split_raw_bytes =&218&依赖 +Reduce input record&500000&依赖 +Reduce input group&500000&依赖 +Reduce output record&500000&依赖 +Number&file&AGGREGATION +# map&barrier&依赖 +#&exception&AGGREGATION +slots_millis_maps =&6541&依赖 +slots_millis_reduces =&9293&依赖 +file_bytes_written =&102156988&依赖 +slots_millis_maps =&6249&依赖 +slots_millis_reduces =&9218&依赖 +file_bytes_written =&102156990&依赖 +slots_millis_maps =&6390&依赖 +slots_millis_reduces =&9240&依赖 +file_bytes_written =&102162937&依赖 +fast block copy&datum&AGGREGATION +Planned enhancement&fuller utilitzation&依赖 +its©& +Planned enhancement&capability&依赖 +terabyte&datum&AGGREGATION +fuller utilitzation&capability&AGGREGATION +fast block copy&terabyte&AGGREGATION +matter&second&AGGREGATION +capability&Kove XPD&AGGREGATION diff --git "a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt" "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt" new file mode 100644 index 0000000..accbf13 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt" @@ -0,0 +1,1138 @@ +Hadoop clusters with Kove® XPD™ persistent memory + + +Mark Kerzner (mark@hadoopilluminated.com), Greg Keller (greg@r-hpc.com), Ivan Lazarov (ivan.lazarov@shmsoft.com), Sujee Maniyam (sujee@hadoopilluminated.com) + + +Abstract + + +Since the Hadoop cluster stores its most vital information on its NameNode server in RAM, this represents a potential point of failure and source of data loss. The usual precautions take the form of storing this information on multiple local hard drives and on a remote one. However, even if the data is preserved in the case of failure, it make take many hours to restore the cluster to its operation. + + +In contrast, by running the Hadoop NameNode on the Kove XPD, one can achieve very fast restoration of Hadoop functionality after such failures as a power loss or motherboard failure. This is accomplished by running a modified version of the Hadoop software, which maps the memory space of the NameNode onto the Kove XPD and can be found on GitHub here https://github.com/markkerzner/nn_kove. + + +Standard RAM presents yet another limitation on Hadoop: it makes it limited in size. One can only store as much data (files and blocks) as the RAM will allow. By contrast, Kove XPD is unlimited in size, and thus using it results in the removal of this limitation on the Hadoop cluster size. + + +Background + + +The Hadoop NameNode saves all of its block and file information in memory. This is done for the sake of efficiency, but it is naturally a single point of failure. There are multiple approaches to alleviate this SPOF, ranging from NameNode HA in Hadoop 2 to distributed NameNode. + + +However, a very enticing prospect is running NameNode on persistent memory, provided by the Kove XPD device. + + +The advantages of this implementation would be twofold. + + +1. Persistent memory is resistant to power failure. If this approach is proven viable, the software architecture for Hadoop NameNode on Kove can be simplified. + + +2. The size of the Kove memory is virtually unlimited, and these devices can be scaled well beyond a terabyte. With this much memory, the NameNode can store much more information, lifting the limitations on the number of files stored in Hadoop and obviating the need for federation. + + + +The diagram below summarizes our thoughts up until this point. + + + + +Possible approaches + + +Here is the summary of our approaches we have tried. + + +Given that the NameNode stores following data in memory (simplified view), we have these major actors. + + +machine -> blockList (DataNodeMap, DatanodeDescriptor, BlockInfo) + +block -> machineList (BlocksMap, BlockInfo) + + +Also these structures are referenced within FSImage structures (INode, FSDirectory) and some additional structures like CorruptReplicasMap, recentInvalidateSets, PendingBlockInfo, ExcessReplicateMap, PendingReplicationBlocks, UnderReplicatedBlocks. + + +All structures of interest are centered around FSNamesystem and are relatively tightly coupled, which implies careful refactoring with small steps. + +Here is how new HDFS file is created +1). Client -> Namenode + + DFSClient + +DFSOutputStream + + namenode.addBlock (through RPC) + + FSNameSystem.getAdditionalBlock() + + lease + + replicator.chooseTargets() -> DatanodeDesciptor[] + + newBlock = allocateBlock(src, pathINodes); + + FSDirectory.addBlock + + // associate the new list of blocks with this file + +namesystem.blocksMap.addINode(block, fileNode); + +BlockInfo blockInfo = namesystem.blocksMap.getStoredBlock(block); + + fileNode.addBlock(blockInfo); + +pendingFile.setTargets(targets); + + +2). Client -> Datanode + +connect to Datanode directly and transfer data... + +Class diagram displaying some of affected classes + + +Possible ways to implement storing Namenode data on Kove instead of memory +Data exchange with Kove requires usage of special buffer registered with API. Registration takes time (about 100 microseconds), and same for copying data to/from buffers (each read/write about 1 microsecond). + +Thus we have 4 ways to use it: + + +a. Create and register big buffer ourselves and do all modifications right inside the buffer. The buffer has to fit into normal memory. This is the fastest: buffer is created once at the start of NameNode, and cost of data transfer to/from other memory areas is minimized. This is the question: “Will it be easy to implement access to ‘native’ data structure from DataNode and does this bring more overhead?” This is likely the longest to implement. + + +b. Create and register smaller buffer(s) ourselves and use them multiple times for different chunks of data. This will require moving data to and from buffers which takes some time. But hopefully this also means fewer changes in DataNode data structures. Not limited to normal memory size. + + +c. Some combination of (a) and (b): try to cache most frequently/recently accessed areas (blocks?) in buffers registered for data exchange. When a certain area is in memory, we modify it in place and transfer to Kove. If not, we obsolete some buffer and use it for area of interest. May be an improvement over (b) but additional code to deal with caching, and need to see what overhead will caching itself give. + + +d. Have API registering memory and transferring the data behind the scenes. Easiest to implement, but probably the slowest: will read/write to library created buffers and occasionally have new buffers registered + + + +Our implementation + + +In the end, we have implemented the NameNode changes using the EHCache library. Ehcache is an open source, standards-based cache for boosting performance, offloading your database, and simplifying scalability. It's the most widely-used Java-based cache because it's robust, proven, and full-featured. + + +We used it to replace the Java objects with EHCache objects and stored them to the XPD. Now came the time to test. + + +This implementation can be found on github here, https://github.com/markkerzner/nn_kove. + + +Testing + + +For testing with used NNBench and a combination of teragen/terasort. The results of the runs are given below. + + +One may notice that the performance of the cluster when using Kove is about 50% of the in-memory Hadoop code. This is to be expected. For our initial prototype treated the Kove XPD as KDSA block device, since it was easier to implement. The proper way, however, will be to use direct writes with Java to C interface, which has the performance of twice the block device. Thus, with the more meticulous implementation we would achieve the speed comparable to in-memory Hadoop code. + + +Appendix: test results + + +There are four groups of test results given below. + + +============ BLOCKSMAP + KOVE ============ + + +---- terasort ---- + + + +hadoop jar hadoop-examples-1.1.2.jar teragen 500000 /user/hduser/terasort-input + +hadoop jar hadoop-examples-1.1.2.jar terasort /user/hduser/terasort-input /user/hduser/terasort-output + + +13/08/07 07:12:53 INFO mapred.JobClient: map 0% reduce 0% + +13/08/07 07:12:58 INFO mapred.JobClient: map 100% reduce 0% + +13/08/07 07:13:05 INFO mapred.JobClient: map 100% reduce 33% + +13/08/07 07:13:07 INFO mapred.JobClient: map 100% reduce 100% + +13/08/07 07:13:07 INFO mapred.JobClient: Job complete: job_201308070712_0002 + +13/08/07 07:13:07 INFO mapred.JobClient: Counters: 30 + +13/08/07 07:13:07 INFO mapred.JobClient: Job Counters + +13/08/07 07:13:07 INFO mapred.JobClient: Launched reduce tasks=1 + +13/08/07 07:13:07 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=6462 + +13/08/07 07:13:07 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 + +13/08/07 07:13:07 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 + +13/08/07 07:13:07 INFO mapred.JobClient: Rack-local map tasks=2 + +13/08/07 07:13:07 INFO mapred.JobClient: Launched map tasks=2 + +13/08/07 07:13:07 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=9238 + +13/08/07 07:13:07 INFO mapred.JobClient: File Input Format Counters + +13/08/07 07:13:07 INFO mapred.JobClient: Bytes Read=50000000 + +13/08/07 07:13:07 INFO mapred.JobClient: File Output Format Counters + +13/08/07 07:13:07 INFO mapred.JobClient: Bytes Written=50000000 + +13/08/07 07:13:07 INFO mapred.JobClient: FileSystemCounters + +13/08/07 07:13:07 INFO mapred.JobClient: FILE_BYTES_READ=51000264 + +13/08/07 07:13:07 INFO mapred.JobClient: HDFS_BYTES_READ=50000218 + +13/08/07 07:13:07 INFO mapred.JobClient: FILE_BYTES_WRITTEN=102164352 + +13/08/07 07:13:07 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=50000000 + +13/08/07 07:13:07 INFO mapred.JobClient: Map-Reduce Framework + +13/08/07 07:13:07 INFO mapred.JobClient: Map output materialized bytes=51000012 + +13/08/07 07:13:07 INFO mapred.JobClient: Map input records=500000 + +13/08/07 07:13:07 INFO mapred.JobClient: Reduce shuffle bytes=51000012 + +13/08/07 07:13:07 INFO mapred.JobClient: Spilled Records=1000000 + +13/08/07 07:13:07 INFO mapred.JobClient: Map output bytes=50000000 + +13/08/07 07:13:07 INFO mapred.JobClient: Total committed heap usage (bytes)=602996736 + +13/08/07 07:13:07 INFO mapred.JobClient: CPU time spent (ms)=6860 + +13/08/07 07:13:07 INFO mapred.JobClient: Map input bytes=50000000 + +13/08/07 07:13:07 INFO mapred.JobClient: SPLIT_RAW_BYTES=218 + +13/08/07 07:13:07 INFO mapred.JobClient: Combine input records=0 + +13/08/07 07:13:07 INFO mapred.JobClient: Reduce input records=500000 + +13/08/07 07:13:07 INFO mapred.JobClient: Reduce input groups=500000 + +13/08/07 07:13:07 INFO mapred.JobClient: Combine output records=0 + +13/08/07 07:13:07 INFO mapred.JobClient: Physical memory (bytes) snapshot=615641088 + +13/08/07 07:13:07 INFO mapred.JobClient: Reduce output records=500000 + +13/08/07 07:13:07 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2303033344 + +13/08/07 07:13:07 INFO mapred.JobClient: Map output records=500000 + +13/08/07 07:13:07 INFO terasort.TeraSort: done + + + +map() completion: 1.0 + +reduce() completion: 1.0 + + +Counters: 30 + + Job Counters + + Launched reduce tasks=1 + + SLOTS_MILLIS_MAPS=6462 + + + Total time spent by all reduces waiting after reserving slots (ms)=0 + + Total time spent by all maps waiting after reserving slots (ms)=0 + + Rack-local map tasks=2 + + Launched map tasks=2 + + SLOTS_MILLIS_REDUCES=9238 + + + File Input Format Counters + + Bytes Read=50000000 + + File Output Format Counters + + Bytes Written=50000000 + + FileSystemCounters + + FILE_BYTES_READ=51000264 + + HDFS_BYTES_READ=50000218 + + FILE_BYTES_WRITTEN=102164352 + + + HDFS_BYTES_WRITTEN=50000000 + + Map-Reduce Framework + + Map output materialized bytes=51000012 + + Map input records=500000 + + Reduce shuffle bytes=51000012 + + Spilled Records=1000000 + + Map output bytes=50000000 + + Total committed heap usage (bytes)=602996736 + + CPU time spent (ms)=6860 + + + Map input bytes=50000000 + + SPLIT_RAW_BYTES=218 + + Combine input records=0 + + Reduce input records=500000 + + Reduce input groups=500000 + + Combine output records=0 + + Physical memory (bytes) snapshot=615641088 + + Reduce output records=500000 + + Virtual memory (bytes) snapshot=2303033344 + + Map output records=500000 + + + +---- nn bench ---- + + +hadoop jar hadoop-test-1.1.2.jar nnbench -operation create_write -maps 2 -reduces 1 -blockSize 1 -bytesToWrite 20 -bytesPerChecksum 1 -numberOfFiles 100 -replicationFactorPerFile 1 + + +13/08/07 07:53:08 INFO hdfs.NNBench: -------------- NNBench -------------- : + +13/08/07 07:53:08 INFO hdfs.NNBench: Version: NameNode Benchmark 0.4 + +13/08/07 07:53:08 INFO hdfs.NNBench: Date & time: 2013-08-07 07:53:08,57 + +13/08/07 07:53:08 INFO hdfs.NNBench: + +13/08/07 07:53:08 INFO hdfs.NNBench: Test Operation: create_write + +13/08/07 07:53:08 INFO hdfs.NNBench: Start time: 2013-08-07 07:45:15,177 + +13/08/07 07:53:08 INFO hdfs.NNBench: Maps to run: 2 + +13/08/07 07:53:08 INFO hdfs.NNBench: Reduces to run: 1 + +13/08/07 07:53:08 INFO hdfs.NNBench: Block Size (bytes): 1 + +13/08/07 07:53:08 INFO hdfs.NNBench: Bytes to write: 20 + +13/08/07 07:53:08 INFO hdfs.NNBench: Bytes per checksum: 1 + +13/08/07 07:53:08 INFO hdfs.NNBench: Number of files: 100 + +13/08/07 07:53:08 INFO hdfs.NNBench: Replication factor: 1 + +13/08/07 07:53:08 INFO hdfs.NNBench: Successful file operations: 200 + +13/08/07 07:53:08 INFO hdfs.NNBench: + +13/08/07 07:53:08 INFO hdfs.NNBench: # maps that missed the barrier: 0 + +13/08/07 07:53:08 INFO hdfs.NNBench: # exceptions: 0 + +13/08/07 07:53:08 INFO hdfs.NNBench: + +13/08/07 07:53:08 INFO hdfs.NNBench: TPS: Create/Write/Close: 65 + +13/08/07 07:53:08 INFO hdfs.NNBench: Avg exec time (ms): Create/Write/Close: 60.03 + +13/08/07 07:53:08 INFO hdfs.NNBench: Avg Lat (ms): Create/Write: 3.58 + +13/08/07 07:53:08 INFO hdfs.NNBench: Avg Lat (ms): Close: 56.375 + +13/08/07 07:53:08 INFO hdfs.NNBench: + +13/08/07 07:53:08 INFO hdfs.NNBench: RAW DATA: AL Total #1: 716 + +13/08/07 07:53:08 INFO hdfs.NNBench: RAW DATA: AL Total #2: 11275 + +13/08/07 07:53:08 INFO hdfs.NNBench: RAW DATA: TPS Total (ms): 12006 + +13/08/07 07:53:08 INFO hdfs.NNBench: RAW DATA: Longest Map Time (ms): 6143.0 + +13/08/07 07:53:08 INFO hdfs.NNBench: RAW DATA: Late maps: 0 + +13/08/07 07:53:08 INFO hdfs.NNBench: RAW DATA: # of exceptions: 0 + + +------------------------------------------------------------------------------------------------------------------- + +============ BLOCKSMAP + DISK ============ + + +---- terasort ---- + + + +hadoop jar hadoop-examples-1.1.2.jar teragen 500000 /user/hduser/terasort-input + +hadoop jar hadoop-examples-1.1.2.jar terasort /user/hduser/terasort-input /user/hduser/terasort-output + + +13/08/07 08:06:46 INFO mapred.JobClient: Running job: job_201308070806_0002 + +13/08/07 08:06:47 INFO mapred.JobClient: map 0% reduce 0% + +13/08/07 08:06:52 INFO mapred.JobClient: map 100% reduce 0% + +13/08/07 08:06:59 INFO mapred.JobClient: map 100% reduce 33% + +13/08/07 08:07:01 INFO mapred.JobClient: map 100% reduce 100% + +13/08/07 08:07:01 INFO mapred.JobClient: Job complete: job_201308070806_0002 + +13/08/07 08:07:01 INFO mapred.JobClient: Counters: 30 + +13/08/07 08:07:01 INFO mapred.JobClient: Job Counters + +13/08/07 08:07:01 INFO mapred.JobClient: Launched reduce tasks=1 + +13/08/07 08:07:01 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=6541 + +13/08/07 08:07:01 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 + +13/08/07 08:07:01 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 + +13/08/07 08:07:01 INFO mapred.JobClient: Rack-local map tasks=2 + +13/08/07 08:07:01 INFO mapred.JobClient: Launched map tasks=2 + +13/08/07 08:07:01 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=9293 + +13/08/07 08:07:01 INFO mapred.JobClient: File Input Format Counters + +13/08/07 08:07:01 INFO mapred.JobClient: Bytes Read=50000000 + +13/08/07 08:07:01 INFO mapred.JobClient: File Output Format Counters + +13/08/07 08:07:01 INFO mapred.JobClient: Bytes Written=50000000 + +13/08/07 08:07:01 INFO mapred.JobClient: FileSystemCounters + +13/08/07 08:07:01 INFO mapred.JobClient: FILE_BYTES_READ=51000264 + +13/08/07 08:07:01 INFO mapred.JobClient: HDFS_BYTES_READ=50000218 + +13/08/07 08:07:01 INFO mapred.JobClient: FILE_BYTES_WRITTEN=102156988 + +13/08/07 08:07:01 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=50000000 + +13/08/07 08:07:01 INFO mapred.JobClient: Map-Reduce Framework + +13/08/07 08:07:01 INFO mapred.JobClient: Map output materialized bytes=51000012 + +13/08/07 08:07:01 INFO mapred.JobClient: Map input records=500000 + +13/08/07 08:07:01 INFO mapred.JobClient: Reduce shuffle bytes=51000012 + +13/08/07 08:07:01 INFO mapred.JobClient: Spilled Records=1000000 + +13/08/07 08:07:01 INFO mapred.JobClient: Map output bytes=50000000 + +13/08/07 08:07:01 INFO mapred.JobClient: Total committed heap usage (bytes)=602996736 + +13/08/07 08:07:01 INFO mapred.JobClient: CPU time spent (ms)=6940 + +13/08/07 08:07:01 INFO mapred.JobClient: Map input bytes=50000000 + +13/08/07 08:07:01 INFO mapred.JobClient: SPLIT_RAW_BYTES=218 + +13/08/07 08:07:01 INFO mapred.JobClient: Combine input records=0 + +13/08/07 08:07:01 INFO mapred.JobClient: Reduce input records=500000 + +13/08/07 08:07:01 INFO mapred.JobClient: Reduce input groups=500000 + +13/08/07 08:07:01 INFO mapred.JobClient: Combine output records=0 + +13/08/07 08:07:01 INFO mapred.JobClient: Physical memory (bytes) snapshot=612827136 + +13/08/07 08:07:01 INFO mapred.JobClient: Reduce output records=500000 + +13/08/07 08:07:01 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2305966080 + +13/08/07 08:07:01 INFO mapred.JobClient: Map output records=500000 + +13/08/07 08:07:01 INFO terasort.TeraSort: done + + + +Counters: 30 + + Job Counters + + Launched reduce tasks=1 + + SLOTS_MILLIS_MAPS=6541 + + + Total time spent by all reduces waiting after reserving slots (ms)=0 + + Total time spent by all maps waiting after reserving slots (ms)=0 + + Rack-local map tasks=2 + + Launched map tasks=2 + + SLOTS_MILLIS_REDUCES=9293 + + + File Input Format Counters + + Bytes Read=50000000 + + File Output Format Counters + + Bytes Written=50000000 + + FileSystemCounters + + FILE_BYTES_READ=51000264 + + HDFS_BYTES_READ=50000218 + + FILE_BYTES_WRITTEN=102156988 + + + HDFS_BYTES_WRITTEN=50000000 + + Map-Reduce Framework + + Map output materialized bytes=51000012 + + Map input records=500000 + + Reduce shuffle bytes=51000012 + + Spilled Records=1000000 + + Map output bytes=50000000 + + Total committed heap usage (bytes)=602996736 + + CPU time spent (ms)=6940 + + + Map input bytes=50000000 + + SPLIT_RAW_BYTES=218 + + Combine input records=0 + + Reduce input records=500000 + + Reduce input groups=500000 + + Combine output records=0 + + Physical memory (bytes) snapshot=612827136 + + Reduce output records=500000 + + Virtual memory (bytes) snapshot=2305966080 + + Map output records=500000 + + + + + +---- nn bench ---- + + +hadoop jar hadoop-test-1.1.2.jar nnbench -operation create_write -maps 2 -reduces 1 -blockSize 1 -bytesToWrite 20 -bytesPerChecksum 1 -numberOfFiles 100 -replicationFactorPerFile 1 + + +13/08/07 08:11:17 INFO hdfs.NNBench: -------------- NNBench -------------- : + +13/08/07 08:11:17 INFO hdfs.NNBench: Version: NameNode Benchmark 0.4 + +13/08/07 08:11:17 INFO hdfs.NNBench: Date & time: 2013-08-07 08:11:17,388 + +13/08/07 08:11:17 INFO hdfs.NNBench: + +13/08/07 08:11:17 INFO hdfs.NNBench: Test Operation: create_write + +13/08/07 08:11:17 INFO hdfs.NNBench: Start time: 2013-08-07 08:11:01,121 + +13/08/07 08:11:17 INFO hdfs.NNBench: Maps to run: 2 + +13/08/07 08:11:17 INFO hdfs.NNBench: Reduces to run: 1 + +13/08/07 08:11:17 INFO hdfs.NNBench: Block Size (bytes): 1 + +13/08/07 08:11:17 INFO hdfs.NNBench: Bytes to write: 20 + +13/08/07 08:11:17 INFO hdfs.NNBench: Bytes per checksum: 1 + +13/08/07 08:11:17 INFO hdfs.NNBench: Number of files: 100 + +13/08/07 08:11:17 INFO hdfs.NNBench: Replication factor: 1 + +13/08/07 08:11:17 INFO hdfs.NNBench: Successful file operations: 200 + +13/08/07 08:11:17 INFO hdfs.NNBench: + +13/08/07 08:11:17 INFO hdfs.NNBench: # maps that missed the barrier: 0 + +13/08/07 08:11:17 INFO hdfs.NNBench: # exceptions: 0 + +13/08/07 08:11:17 INFO hdfs.NNBench: + +13/08/07 08:11:17 INFO hdfs.NNBench: TPS: Create/Write/Close: 65 + +13/08/07 08:11:17 INFO hdfs.NNBench: Avg exec time (ms): Create/Write/Close: 58.86 + +13/08/07 08:11:17 INFO hdfs.NNBench: Avg Lat (ms): Create/Write: 3.18 + +13/08/07 08:11:17 INFO hdfs.NNBench: Avg Lat (ms): Close: 55.59 + +13/08/07 08:11:17 INFO hdfs.NNBench: + +13/08/07 08:11:17 INFO hdfs.NNBench: RAW DATA: AL Total #1: 636 + +13/08/07 08:11:17 INFO hdfs.NNBench: RAW DATA: AL Total #2: 11118 + +13/08/07 08:11:17 INFO hdfs.NNBench: RAW DATA: TPS Total (ms): 11772 + +13/08/07 08:11:17 INFO hdfs.NNBench: RAW DATA: Longest Map Time (ms): 6122.0 + +13/08/07 08:11:17 INFO hdfs.NNBench: RAW DATA: Late maps: 0 + +13/08/07 08:11:17 INFO hdfs.NNBench: RAW DATA: # of exceptions: 0 + +13/08/07 08:11:17 INFO hdfs.NNBench: + + + +============ REGULAR HADOOP + DISK ============ + + +---- terasort ---- + + + +hadoop jar hadoop-examples-1.1.2.jar teragen 500000 /user/hduser/terasort-input + +hadoop jar hadoop-examples-1.1.2.jar terasort /user/hduser/terasort-input /user/hduser/terasort-output + + +13/08/07 08:26:03 INFO mapred.JobClient: Running job: job_201308070825_0002 + +13/08/07 08:26:04 INFO mapred.JobClient: map 0% reduce 0% + +13/08/07 08:26:08 INFO mapred.JobClient: map 100% reduce 0% + +13/08/07 08:26:15 INFO mapred.JobClient: map 100% reduce 33% + +13/08/07 08:26:17 INFO mapred.JobClient: map 100% reduce 100% + +13/08/07 08:26:17 INFO mapred.JobClient: Job complete: job_201308070825_0002 + +13/08/07 08:26:17 INFO mapred.JobClient: Counters: 30 + +13/08/07 08:26:17 INFO mapred.JobClient: Job Counters + +13/08/07 08:26:17 INFO mapred.JobClient: Launched reduce tasks=1 + +13/08/07 08:26:17 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=6249 + +13/08/07 08:26:17 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 + +13/08/07 08:26:17 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 + +13/08/07 08:26:17 INFO mapred.JobClient: Launched map tasks=2 + +13/08/07 08:26:17 INFO mapred.JobClient: Data-local map tasks=2 + +13/08/07 08:26:17 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=9218 + +13/08/07 08:26:17 INFO mapred.JobClient: File Input Format Counters + +13/08/07 08:26:17 INFO mapred.JobClient: Bytes Read=50000000 + +13/08/07 08:26:17 INFO mapred.JobClient: File Output Format Counters + +13/08/07 08:26:17 INFO mapred.JobClient: Bytes Written=50000000 + +13/08/07 08:26:17 INFO mapred.JobClient: FileSystemCounters + +13/08/07 08:26:17 INFO mapred.JobClient: FILE_BYTES_READ=51000264 + +13/08/07 08:26:17 INFO mapred.JobClient: HDFS_BYTES_READ=50000218 + +13/08/07 08:26:17 INFO mapred.JobClient: FILE_BYTES_WRITTEN=102156990 + +13/08/07 08:26:17 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=50000000 + +13/08/07 08:26:17 INFO mapred.JobClient: Map-Reduce Framework + +13/08/07 08:26:17 INFO mapred.JobClient: Map output materialized bytes=51000012 + +13/08/07 08:26:17 INFO mapred.JobClient: Map input records=500000 + +13/08/07 08:26:17 INFO mapred.JobClient: Reduce shuffle bytes=51000012 + +13/08/07 08:26:17 INFO mapred.JobClient: Spilled Records=1000000 + +13/08/07 08:26:17 INFO mapred.JobClient: Map output bytes=50000000 + +13/08/07 08:26:17 INFO mapred.JobClient: Total committed heap usage (bytes)=602996736 + +13/08/07 08:26:17 INFO mapred.JobClient: CPU time spent (ms)=6690 + +13/08/07 08:26:17 INFO mapred.JobClient: Map input bytes=50000000 + +13/08/07 08:26:17 INFO mapred.JobClient: SPLIT_RAW_BYTES=218 + +13/08/07 08:26:17 INFO mapred.JobClient: Combine input records=0 + +13/08/07 08:26:17 INFO mapred.JobClient: Reduce input records=500000 + +13/08/07 08:26:17 INFO mapred.JobClient: Reduce input groups=500000 + +13/08/07 08:26:17 INFO mapred.JobClient: Combine output records=0 + +13/08/07 08:26:17 INFO mapred.JobClient: Physical memory (bytes) snapshot=609116160 + +13/08/07 08:26:17 INFO mapred.JobClient: Reduce output records=500000 + +13/08/07 08:26:17 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2309636096 + +13/08/07 08:26:17 INFO mapred.JobClient: Map output records=500000 + +13/08/07 08:26:17 INFO terasort.TeraSort: done + + + +Counters: 30 + + Job Counters + + Launched reduce tasks=1 + + SLOTS_MILLIS_MAPS=6249 + + + Total time spent by all reduces waiting after reserving slots (ms)=0 + + Total time spent by all maps waiting after reserving slots (ms)=0 + + Launched map tasks=2 + + Data-local map tasks=2 + + SLOTS_MILLIS_REDUCES=9218 + + + File Input Format Counters + + Bytes Read=50000000 + + File Output Format Counters + + Bytes Written=50000000 + + FileSystemCounters + + FILE_BYTES_READ=51000264 + + HDFS_BYTES_READ=50000218 + + FILE_BYTES_WRITTEN=102156990 + + + HDFS_BYTES_WRITTEN=50000000 + + Map-Reduce Framework + + Map output materialized bytes=51000012 + + Map input records=500000 + + Reduce shuffle bytes=51000012 + + Spilled Records=1000000 + + Map output bytes=50000000 + + Total committed heap usage (bytes)=602996736 + + CPU time spent (ms)=6690 + + + Map input bytes=50000000 + + SPLIT_RAW_BYTES=218 + + Combine input records=0 + + Reduce input records=500000 + + Reduce input groups=500000 + + Combine output records=0 + + Physical memory (bytes) snapshot=609116160 + + Reduce output records=500000 + + Virtual memory (bytes) snapshot=2309636096 + + Map output records=500000 + + + +---- nn bench ---- + + +hadoop jar hadoop-test-1.1.2.jar nnbench -operation create_write -maps 2 -reduces 1 -blockSize 1 -bytesToWrite 20 -bytesPerChecksum 1 -numberOfFiles 100 -replicationFactorPerFile 1 + + +13/08/07 08:30:45 INFO hdfs.NNBench: -------------- NNBench -------------- : + +13/08/07 08:30:45 INFO hdfs.NNBench: Version: NameNode Benchmark 0.4 + +13/08/07 08:30:45 INFO hdfs.NNBench: Date & time: 2013-08-07 08:30:45,180 + +13/08/07 08:30:45 INFO hdfs.NNBench: + +13/08/07 08:30:45 INFO hdfs.NNBench: Test Operation: create_write + +13/08/07 08:30:45 INFO hdfs.NNBench: Start time: 2013-08-07 08:30:30,955 + +13/08/07 08:30:45 INFO hdfs.NNBench: Maps to run: 2 + +13/08/07 08:30:45 INFO hdfs.NNBench: Reduces to run: 1 + +13/08/07 08:30:45 INFO hdfs.NNBench: Block Size (bytes): 1 + +13/08/07 08:30:45 INFO hdfs.NNBench: Bytes to write: 20 + +13/08/07 08:30:45 INFO hdfs.NNBench: Bytes per checksum: 1 + +13/08/07 08:30:45 INFO hdfs.NNBench: Number of files: 100 + +13/08/07 08:30:45 INFO hdfs.NNBench: Replication factor: 1 + +13/08/07 08:30:45 INFO hdfs.NNBench: Successful file operations: 200 + +13/08/07 08:30:45 INFO hdfs.NNBench: + +13/08/07 08:30:45 INFO hdfs.NNBench: # maps that missed the barrier: 0 + +13/08/07 08:30:45 INFO hdfs.NNBench: # exceptions: 0 + +13/08/07 08:30:45 INFO hdfs.NNBench: + +13/08/07 08:30:45 INFO hdfs.NNBench: TPS: Create/Write/Close: 87 + +13/08/07 08:30:45 INFO hdfs.NNBench: Avg exec time (ms): Create/Write/Close: 42.895 + +13/08/07 08:30:45 INFO hdfs.NNBench: Avg Lat (ms): Create/Write: 3.16 + +13/08/07 08:30:45 INFO hdfs.NNBench: Avg Lat (ms): Close: 39.655 + +13/08/07 08:30:45 INFO hdfs.NNBench: + +13/08/07 08:30:45 INFO hdfs.NNBench: RAW DATA: AL Total #1: 632 + +13/08/07 08:30:45 INFO hdfs.NNBench: RAW DATA: AL Total #2: 7931 + +13/08/07 08:30:45 INFO hdfs.NNBench: RAW DATA: TPS Total (ms): 8579 + +13/08/07 08:30:45 INFO hdfs.NNBench: RAW DATA: Longest Map Time (ms): 4547.0 + +13/08/07 08:30:45 INFO hdfs.NNBench: RAW DATA: Late maps: 0 + +13/08/07 08:30:45 INFO hdfs.NNBench: RAW DATA: # of exceptions: 0 + +13/08/07 08:30:45 INFO hdfs.NNBench: + + +============ REGULAR HADOOP + KOVE ============ + + +---- terasort ---- + + + +hadoop jar hadoop-examples-1.1.2.jar teragen 500000 /user/hduser/terasort-input + +hadoop jar hadoop-examples-1.1.2.jar terasort /user/hduser/terasort-input /user/hduser/terasort-output + + +13/08/07 08:35:25 INFO mapred.JobClient: Running job: job_201308070834_0002 + +13/08/07 08:35:26 INFO mapred.JobClient: map 0% reduce 0% + +13/08/07 08:35:31 INFO mapred.JobClient: map 100% reduce 0% + +13/08/07 08:35:38 INFO mapred.JobClient: map 100% reduce 33% + +13/08/07 08:35:40 INFO mapred.JobClient: map 100% reduce 100% + +13/08/07 08:35:40 INFO mapred.JobClient: Job complete: job_201308070834_0002 + +13/08/07 08:35:40 INFO mapred.JobClient: Counters: 30 + +13/08/07 08:35:40 INFO mapred.JobClient: Job Counters + +13/08/07 08:35:40 INFO mapred.JobClient: Launched reduce tasks=1 + +13/08/07 08:35:40 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=6390 + +13/08/07 08:35:40 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 + +13/08/07 08:35:40 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 + +13/08/07 08:35:40 INFO mapred.JobClient: Rack-local map tasks=2 + +13/08/07 08:35:40 INFO mapred.JobClient: Launched map tasks=2 + +13/08/07 08:35:40 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=9240 + +13/08/07 08:35:40 INFO mapred.JobClient: File Input Format Counters + +13/08/07 08:35:40 INFO mapred.JobClient: Bytes Read=50000000 + +13/08/07 08:35:40 INFO mapred.JobClient: File Output Format Counters + +13/08/07 08:35:40 INFO mapred.JobClient: Bytes Written=50000000 + +13/08/07 08:35:40 INFO mapred.JobClient: FileSystemCounters + +13/08/07 08:35:40 INFO mapred.JobClient: FILE_BYTES_READ=51000264 + +13/08/07 08:35:40 INFO mapred.JobClient: HDFS_BYTES_READ=50000218 + +13/08/07 08:35:40 INFO mapred.JobClient: FILE_BYTES_WRITTEN=102162937 + +13/08/07 08:35:40 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=50000000 + +13/08/07 08:35:40 INFO mapred.JobClient: Map-Reduce Framework + +13/08/07 08:35:40 INFO mapred.JobClient: Map output materialized bytes=51000012 + +13/08/07 08:35:40 INFO mapred.JobClient: Map input records=500000 + +13/08/07 08:35:40 INFO mapred.JobClient: Reduce shuffle bytes=51000012 + +13/08/07 08:35:40 INFO mapred.JobClient: Spilled Records=1000000 + +13/08/07 08:35:40 INFO mapred.JobClient: Map output bytes=50000000 + +13/08/07 08:35:40 INFO mapred.JobClient: Total committed heap usage (bytes)=602996736 + +13/08/07 08:35:40 INFO mapred.JobClient: CPU time spent (ms)=6660 + +13/08/07 08:35:40 INFO mapred.JobClient: Map input bytes=50000000 + +13/08/07 08:35:40 INFO mapred.JobClient: SPLIT_RAW_BYTES=218 + +13/08/07 08:35:40 INFO mapred.JobClient: Combine input records=0 + +13/08/07 08:35:40 INFO mapred.JobClient: Reduce input records=500000 + +13/08/07 08:35:40 INFO mapred.JobClient: Reduce input groups=500000 + +13/08/07 08:35:40 INFO mapred.JobClient: Combine output records=0 + +13/08/07 08:35:40 INFO mapred.JobClient: Physical memory (bytes) snapshot=611500032 + +13/08/07 08:35:40 INFO mapred.JobClient: Reduce output records=500000 + +13/08/07 08:35:40 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2300420096 + +13/08/07 08:35:40 INFO mapred.JobClient: Map output records=500000 + +13/08/07 08:35:40 INFO terasort.TeraSort: done + + + +Counters: 30 + + Job Counters + + Launched reduce tasks=1 + + SLOTS_MILLIS_MAPS=6390 + + + Total time spent by all reduces waiting after reserving slots (ms)=0 + + Total time spent by all maps waiting after reserving slots (ms)=0 + + Rack-local map tasks=2 + + Launched map tasks=2 + + SLOTS_MILLIS_REDUCES=9240 + + + File Input Format Counters + + Bytes Read=50000000 + + File Output Format Counters + + Bytes Written=50000000 + + FileSystemCounters + + FILE_BYTES_READ=51000264 + + HDFS_BYTES_READ=50000218 + + FILE_BYTES_WRITTEN=102162937 + + + HDFS_BYTES_WRITTEN=50000000 + + Map-Reduce Framework + + Map output materialized bytes=51000012 + + Map input records=500000 + + Reduce shuffle bytes=51000012 + + Spilled Records=1000000 + + Map output bytes=50000000 + + Total committed heap usage (bytes)=602996736 + + CPU time spent (ms)=6660 + + + Map input bytes=50000000 + + SPLIT_RAW_BYTES=218 + + Combine input records=0 + + Reduce input records=500000 + + Reduce input groups=500000 + + Combine output records=0 + + Physical memory (bytes) snapshot=611500032 + + Reduce output records=500000 + + Virtual memory (bytes) snapshot=2300420096 + + Map output records=500000 + + + +---- nn bench ---- + + +hadoop jar hadoop-test-1.1.2.jar nnbench -operation create_write -maps 2 -reduces 1 -blockSize 1 -bytesToWrite 20 -bytesPerChecksum 1 -numberOfFiles 100 -replicationFactorPerFile 1 + + +13/08/07 08:42:43 INFO hdfs.NNBench: -------------- NNBench -------------- : + +13/08/07 08:42:43 INFO hdfs.NNBench: Version: NameNode Benchmark 0.4 + +13/08/07 08:42:43 INFO hdfs.NNBench: Date & time: 2013-08-07 08:42:43,678 + +13/08/07 08:42:43 INFO hdfs.NNBench: + +13/08/07 08:42:43 INFO hdfs.NNBench: Test Operation: create_write + +13/08/07 08:42:43 INFO hdfs.NNBench: Start time: 2013-08-07 08:42:29,426 + +13/08/07 08:42:43 INFO hdfs.NNBench: Maps to run: 2 + +13/08/07 08:42:43 INFO hdfs.NNBench: Reduces to run: 1 + +13/08/07 08:42:43 INFO hdfs.NNBench: Block Size (bytes): 1 + +13/08/07 08:42:43 INFO hdfs.NNBench: Bytes to write: 20 + +13/08/07 08:42:43 INFO hdfs.NNBench: Bytes per checksum: 1 + +13/08/07 08:42:43 INFO hdfs.NNBench: Number of files: 100 + +13/08/07 08:42:43 INFO hdfs.NNBench: Replication factor: 1 + +13/08/07 08:42:43 INFO hdfs.NNBench: Successful file operations: 200 + +13/08/07 08:42:43 INFO hdfs.NNBench: + +13/08/07 08:42:43 INFO hdfs.NNBench: # maps that missed the barrier: 0 + +13/08/07 08:42:43 INFO hdfs.NNBench: # exceptions: 0 + +13/08/07 08:42:43 INFO hdfs.NNBench: + +13/08/07 08:42:43 INFO hdfs.NNBench: TPS: Create/Write/Close: 90 + +13/08/07 08:42:43 INFO hdfs.NNBench: Avg exec time (ms): Create/Write/Close: 42.665 + +13/08/07 08:42:43 INFO hdfs.NNBench: Avg Lat (ms): Create/Write: 3.015 + +13/08/07 08:42:43 INFO hdfs.NNBench: Avg Lat (ms): Close: 39.61 + +13/08/07 08:42:43 INFO hdfs.NNBench: + +13/08/07 08:42:43 INFO hdfs.NNBench: RAW DATA: AL Total #1: 603 + +13/08/07 08:42:43 INFO hdfs.NNBench: RAW DATA: AL Total #2: 7922 + +13/08/07 08:42:43 INFO hdfs.NNBench: RAW DATA: TPS Total (ms): 8533 + +13/08/07 08:42:43 INFO hdfs.NNBench: RAW DATA: Longest Map Time (ms): 4437.0 + +13/08/07 08:42:43 INFO hdfs.NNBench: RAW DATA: Late maps: 0 + +13/08/07 08:42:43 INFO hdfs.NNBench: RAW DATA: # of exceptions: 0 + +13/08/07 08:42:43 INFO hdfs.NNBench: + + + +Conclusion + + +It has been shown that running Hadoop NameNode on a Kove XPD improves cluster reliability and removes the memory size limitation usual for the RAM-based NameNode. + + +Planned enhancements include making fuller utilitzation of all the capabilities of the Kove XPD, described here http://kove.com/, such as its fast block copy of terabytes of data in a matter of seconds. \ No newline at end of file diff --git "a/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt.xml.xls" "b/src/main/resources/sdtocode/doc/Hadoop HDFS/Hadoop clusters with Kove\302\256 XPD\342\204\242 persistent memory.txt.xml.xls" new file mode 100644 index 0000000000000000000000000000000000000000..c8dfe8d64e2c402e7860c1ac020527c429887335 GIT binary patch literal 22528 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture-relation.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture-relation.txt new file mode 100644 index 0000000..cc6b4ee --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture-relation.txt @@ -0,0 +1,176 @@ +get start key design&hdfs architecture march 31 , 2021 hdf ( hadoop&AGGREGATION +get start key design&Global Edge Network Docs Resources Blog Case Studies Content Library Solution Briefs Changelog Engineering Education Partners About Section Pricing Contact Log&依赖 +get start key design&Global Edge Network Docs Resources Blog Case Studies Content Library Solution Briefs Changelog Engineering Education Partners About Section Pricing Contact Log&依赖 +get start key design&get start key design&依赖 +get start key design&Global Edge Network Docs Resources Blog Case Studies Content Library Solution Briefs Changelog Engineering Education Partners About Section Pricing Contact Log&依赖 +get start key design&Global Edge Network Docs Resources Blog Case Studies Content Library Solution Briefs Changelog Engineering Education Partners About Section Pricing Contact Log&依赖 +get start key design&appspace gps_fixedcore platform section control plane edge appspace adaptive edge engine ( aee )&依赖 +get start key design&appspace gps_fixedcore platform section control plane edge appspace adaptive edge engine ( aee )&依赖 +get start key design&get start key design&依赖 +get start key design&get start key design&依赖 +get start key design&get start key design&依赖 +get start key design&Global Edge Network Docs Resources Blog Case Studies Content Library Solution Briefs Changelog Engineering Education Partners About Section Pricing Contact Log&依赖 +get start key design&appspace gps_fixedcore platform section control plane edge appspace adaptive edge engine ( aee )&依赖 +get start key design&appspace gps_fixedcore platform section control plane edge appspace adaptive edge engine ( aee )&依赖 +get start key design&get start key design&依赖 +get start key design&appspace gps_fixedcore platform section control plane edge appspace adaptive edge engine ( aee )&依赖 +several feature&design&AGGREGATION +It&Hadoop framework&实现 +Hadoop framework&framework&GENERALIZATION +hdf ( hadoop&key difference&依赖 +hdf ( hadoop&key difference&依赖 +hdf ( hadoop&other distributed file system&依赖 +fault-tolerance&low-cost hardware&依赖 +hdf ( hadoop&other distributed file system&依赖 +big datum framework general design&hdf datum storage policy colocation&AGGREGATION +what traditional datum processing software application&what traditional datum processing software application&依赖 +its&benefits& +Big data framework&4Vs namely&依赖 +framework&processing&依赖 +framework&datum&依赖 +framework&datum&依赖 +framework&datum&依赖 +( massive amount&datum&AGGREGATION +framework&processing&依赖 +framework&processing&依赖 +processing&datum&AGGREGATION +file system ( hdf )&Hadoop framework&依赖 +hdf&Hadoop technical framework&依赖 +distributed file system&Hadoop technical framework&AGGREGATION +It&scenario&依赖 +website user datum behavior datum storage&website user datum behavior datum storage&依赖 +its&architecture& +General design&design feature&依赖 +design feature&efficient working&依赖 +design feature&architecture&AGGREGATION +its&working& +General design&HDFS architecture The hdf&AGGREGATION +design feature&following&依赖 +General design&architecture&依赖 +hdf&namespace and storage&依赖 +hdf&distinction&依赖 +hdf&feature&依赖 +hdf&data replication&依赖 +data replication&system&依赖 +availability&system&AGGREGATION +data replication&availability&依赖 +single block&datum&AGGREGATION +client&2 other node&依赖 +single block&3 node&依赖 +client&block&依赖 +failure&‘ DataNode ’&依赖 +HDFS framework&framework&GENERALIZATION +primary component&meta-data&依赖 +meta-data&file&AGGREGATION +primary component&file&依赖 +‘ NameNode ’&HDFS framework&依赖 +master node&node&GENERALIZATION +It&master node&依赖 +creation , deletion , and replication&data block&AGGREGATION +node&actual datum&依赖 +node&hdf&依赖 +its&space& +number&replica&AGGREGATION +hdf consist&NameNodes and DataNodes&依赖 +hdf consist&NameNodes and DataNodes&依赖 +hdf consist&NameNodes and DataNodes&AGGREGATION +one NameNode&client&依赖 +single cluster&one NameNode&依赖 +one NameNode&data access&依赖 +DataNode&instruction&依赖 +DataNode&NameNode&依赖 +hdf&coherent file system&依赖 +external process&system&依赖 +external process&one unified system&依赖 +file&blocks& +number&application&依赖 +NameNode&change&依赖 +namenode insert&new file&依赖 +namenode insert&new file&依赖 +creation&new file&AGGREGATION +namenode insert&record&依赖 +namenode insert&creation&依赖 +namenode insert&creation&依赖 +namenode insert&new file&依赖 +new file&hdf&依赖 +namenode insert&creation&依赖 +namenode insert&record&依赖 +namenode insert&record&依赖 +robustness&failure&依赖 +3 common type&failure&AGGREGATION +robustness&failure&依赖 +robustness&3 common type&依赖 +Its&robustness& +robustness&3 common type&依赖 +datum&size 64MB&依赖 +block&size 64MB&AGGREGATION +datum&hdf&依赖 +datum&block&依赖 +hdf&stored datum&依赖 +failure&component&AGGREGATION +completeness&stored datum&AGGREGATION +case&failure&AGGREGATION +hdf&completeness&依赖 +DataNode periodically report&’ message&依赖 +DataNode periodically report&NameNode&依赖 +NameNode&procedure&依赖 +data balance mechanism&datum&依赖 +even distribution&datum&AGGREGATION +data balance mechanism&even distribution&依赖 +Ensures data balance&data balance mechanism&依赖 +data balance mechanism&DataNodes&依赖 +snapshot mechanism&file system&AGGREGATION +Data storage policy&5 storage policy&依赖 +One_SSD – Storage&single replica&AGGREGATION +All_SSD – Storage&replica&AGGREGATION +HDFS NameNode&NameNode&GENERALIZATION +HDFS NameNode&datanode&依赖 +layered storage select&layered data storage&依赖 +layered storage select&proper storage device&依赖 +four type&storage device&AGGREGATION +disk ( mechanical hard disk and ram_disk ( memory virtualization hard disk&ssd ( solid-state disk&依赖 +disk ( mechanical hard disk and ram_disk ( memory virtualization hard disk&ssd ( solid-state disk&依赖 +tag storage select&directory tag&依赖 +tag storage select&directory tag&依赖 +tag storage select&proper DataNode&依赖 +tag storage select&proper DataNode&依赖 +directory tag&data importance level&依赖 +node group storage stores key datum&reliable node group&依赖 +node group storage stores key datum&node group storage stores key datum&依赖 +node group storage stores key datum&node group storage stores key datum&依赖 +node group storage stores key datum&reliable node group&依赖 +node group storage stores key datum&node group storage stores key datum&依赖 +node group storage stores key datum&reliable node group&依赖 +node group storage stores key datum&reliable node group&依赖 +node group storage stores key datum&node group storage stores key datum&依赖 +node group storage stores key datum&node group storage stores key datum&依赖 +node group storage stores key datum&node group storage stores key datum&依赖 +node group storage stores key datum&reliable node group&依赖 +DataNode cluster&heterogeneous server&依赖 +node group storage stores key datum&reliable node group&依赖 +Colocation&associated data or datum&依赖 +storage&associated data or datum&AGGREGATION +great consumption&network resource&AGGREGATION +massive migration&datum&AGGREGATION +datum&massive datum and system performance&依赖 +processing speed&massive datum and system performance&AGGREGATION +benefit&colocation Reduces network bandwidth&AGGREGATION +strength&hdf&AGGREGATION +its&fault-tolerance& +its&ability& +distinct difference&fault-tolerance&依赖 +its&throughput& +Relevant resources HDFS Architecture Guide characteristic&hdfs big data huawei peer review contributions by&AGGREGATION +author ruth mare ruth&Kenyatta University&依赖 +She&computer and cloud network&依赖 +She&research and collaboration&依赖 +article&engineering education program&依赖 +Section&Program& +student member&engineering education program&AGGREGATION +article&student member&依赖 +next generation&engineer&AGGREGATION +community-generated pool&resource&AGGREGATION +Section&pool& +Slack community&Careers Legals Resources Blog Case Studies Content Library Solution Briefs Partners Changelog Support Docs Community Slack Help & Support Platform Status Pricing Section&依赖 +our&community& +Slack community&Slack Company&依赖 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt new file mode 100644 index 0000000..a6ac402 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt @@ -0,0 +1,294 @@ +select_all Edge AppSpace +SolutionHub +Performance / CDN +Security +Virtual Waiting Room +A/B Testing +Search AppSpace +AppStack +Node.js Edge Hosting +RunStack +Containers +Serverless +gps_fixed Core Platform +Section Control Plane +Edge AppSpace +Adaptive Edge Engine (AEE) +Global Edge Network +Solutions +SaaS +PaaS & Hosting Providers +Edge App Hosting +Docs +Resources +Blog +Case Studies +Edge Content Library +Solution Briefs +Product Videos +Engineering Education +About Section +Partners +Changelog +Pricing +Platform +select_allEdge AppSpace +SolutionHub +Performance / CDN +Security +Virtual Waiting Room +A/B Testing +AppStack +Node.js Edge Hosting +RunStack +Containers +Serverless +Search AppSpace +gps_fixedCore Platform +Section Control Plane +Edge AppSpace +Adaptive Edge Engine (AEE) +Global Edge Network +Docs +Resources +Blog +Case Studies +Content Library +Solution Briefs +Changelog +Engineering Education +Partners +About Section +Pricing +Contact +Log In +Get Started +Key Design of HDFS Architecture +March 31, 2021 +HDFS (Hadoop Distributed File System) is a big data distributed file system storage by Apache. It is implemented within the Hadoop framework and it needs to have several features of design implemented to work effectively in processing, distributing, and storing big data. + +HDFS (Hadoop Distributed File System) is similar to other distributed file systems except for some key differences such as, fault-tolerance, high throughput, and ability to be deployed on low-cost hardware. + +Overview +This article will cover: + +Introduction to Big data framework +General design of HDFS architecture +Configuring HDFS data storage policies +Colocation and its benefits in HDFS +Introduction to Big data framework +Big data is data in sets that are of high volume and complexity beyond what traditional data processing software applications can deal with. Big data framework is characterized by 4Vs namely: + +Variety (data is of various forms and types) +Velocity (data processing speed is high) +Value (low data value density) +Volume (massive amount of data) +Apache Hadoop is among the frameworks that can do the processing of data with the characteristics described above. Within the Hadoop framework is the Hadoop Distributed File System (HDFS). + +HDFS is a distributed file system of the Hadoop technical framework that was developed based on the Google File System (GFS) and is used to manage files on multiple independent physical servers. + +It is applied in the following scenarios: + +Ecosystem data storage. +Website user data behavior data storage. +Meteorological data storage. +General design of HDFS architecture +The HDFS has design features of its architecture that enable its efficient working among which are the following: + +Federation storage: HDFS creates a distinction between the namespace and storage. The two are separated to create a block storage layer. + +High Availability: HDFS supports features such as data replication which enhances the availability of the system. A single block of data is replicated in 3 nodes, so that even if a single node fail, a client can access the block from 2 other nodes. + +Data can still be accessed normally even when a failure occurs on the ‘DataNode’ or ‘NameNode’. + +A ‘NameNode’ is a primary component within the HDFS framework that stores meta-data of files, manages and maintains ‘DataNodes’, and assigns them tasks. It is also known as the master node. + +A ‘DataNode’ is a node that stores the actual data within HDFS and does creation, deletion, and replication of data blocks. It also serves read and write requests for clients and is usually known as the slave node. + +Multiple access modes: Within HDFS data can be accessed through HTTP on an HTTP browser, Java API for applications, or any other command shells. + +Space reclamation: Space that had been released in HDFS can be reclaimed. This is implemented by a recycle bin mechanism where data that had been deleted can be restored from the recycle bin to occupy its initial space. The number of replicas can also be dynamically set. + +NameNode/DataNode in master/slave mode: HDFS consists of NameNodes and DataNodes that work in a master/slave architecture. A single cluster consists of only one NameNode which regulates data access by clients and manages the namespace within the file system. + +The DataNode receives instructions from the NameNode on when to create, delete, and replicate data blocks. + +Unified file system Namespace: HDFS is presented externally as a coherent file system. Any external process perceives the system as one unified system. + +Data replication: In HDFS, a file’s blocks are replicated for fault tolerance and the number of replicas can be specified by an application. This can be done at creation time but is subject to change at will. + +Metadata persistence: The HDFS NameNode stores the namespace. The NameNode consistently records every change that occurs in file system metadata in a transaction log file called the ‘EditLog’. + +Whenever a new file is created in HDFS, the NameNode inserts a record into the ‘EditLog’ indicating the creation of the new file. + +This information is also synchronized between the active and the standby NameNode periodically. + +Robustness: HDFS stores data reliably even when a failure occurs. + +Its robustness takes into account the 3 common types of failures: + +DataNode failure +NameNode failure +Network failure +Data organization: Data is stored by blocks of size 64MB in HDFS. + +HDFS Data Integrity Assurance: HDFS ensures the completeness of the stored data by implementing reliability processing in case of failure of each component. + +HDFS accomplishes this by doing the following: + +Reconstructing data replicas in invalid data disks - the DataNode periodically reports blocks’ messages to the NameNode, if one replica (block) fails, the NameNode will start the procedure to recover lost replicas. +Ensures data balance among DataNodes - the HDFS architecture is configured with the data balance mechanism, which ensures the even distribution of data among all DataNodes. +Ensures metadata reliability - the transaction log mechanism is used to operate metadata, which is stored on both active and standby NameNodes. The snapshot mechanism of the file system ensures that data can be recovered promptly when a misoperation occurs. +Provides the security mode - HDFS provides a unique security mode to prevent a fault from spreading when a DataNode or hard disk is faulty. +Data storage policy: HDFS supports 5 storage policies namely: + +Hot – Storage on DISK. +Warm – Storage on both DISK and ARCHIVE. +Cold – Storage on ARCHIVE. +One_SSD – Storage of a single replica on SSD and other replicas on DISK. +All_SSD – Storage of all replicas on SSD. +Configuring HDFS data storage policies +The HDFS NameNode automatically selects DataNodes to store data replicas by default. + +This can be done in the following scenarios: + +Layered storage +Select a proper storage device for layered data storage from multiple devices on a DataNode. + +The HDFS layered storage architecture provides four types of storage devices: + +RAM_DISK (memory virtualization hard disk) +DISK (mechanical hard disk) +ARCHIVE (high-density and low-cost storage media) +SSD (solid-state disk) +To formulate storage policies for different scenarios, the four types of storage devices are combined. + +Tag storage +Select a proper DataNode according to directory tags which indicates data importance levels. + +Node Group Storage +Stores key data in highly reliable node groups because the DataNode cluster uses heterogeneous servers. + +Colocation and its benefits in HDFS +Colocation is the storage of associated data or data that will be associated on the same storage node. + +This is implemented as a solution to the great consumption of network resources during a massive migration of data that affects the processing speed of massive data and system performance greatly. + +Benefits of colocation +Reduces network bandwidth and resource consumption. +Enhances easy and quick access to data. +To wrap up +As mentioned earlier HDFS is similar to other distributed file systems except for some distinct differences that serve as strengths of HDFS over other Distributed File Systems. + +These distinct differences are, its fault-tolerance, its high throughput, and its ability to be deployed on low-cost hardware and support large data sets. + +Happy learning. + +Relevant resources +HDFS Architecture Guide +Characteristics of HDFS +Big Data Huawei +Peer Review Contributions by: Srishilesh P S + +About the author + Ruth Mare +Ruth is an Undergraduate Computer Science student at Kenyatta University. She is passionate about Computer and Cloud networks, Information security, Machine Learning and Artificial Intelligence. She is open to research and collaborations. + +This article was contributed by a student member of Section's Engineering Education Program. Please report any errors or innaccuracies to enged@section.io. +Want to learn more about the EngEd Program? +Discover Section's community-generated pool of resources from the next generation of engineers. + +Learn more +QUICK LINKS // More Section offerings +Edge Modules +Varnish Cache +Nginx/Lua +SiteSpect +Optidash +Cloudinary +ModSecurity +SignalSciences +ThreatX +Wallarm +Snapt +PerimeterX +Radware Bot Manager +Content Security Policy +Virtual Waiting Room +Hugo +Node.js +Custom Workload +View All Modules +DevOps +Real Time Metrics +Log Management +Real User Monitoring +Instant Global Deployments +Developer PoP +Instant Cache Purge +Managed SSL Certificates +APIs +Endpoints +Global Edge Network +Custom Edge Network +Private Edge Network +Origin PoP +Performance & Scalability +Dynamic Content Caching +Static Asset Caching +HTML Streaming +Anonymous Page Caching +Image Optimization +Mobile Optimization +Virtual Waiting Room +HTTP/2 +Edge Delivery +Load Balancing +Maintenance Pages +Anycast DNS Hosting +SSL Certificates +Static Site Deployment +Application Security +Web Application Firewall +IP Blocking +SSL Certificates +DDoS Mitigation +Bad Bot Management +Content Security Policy +Use Cases +SaaS +PaaS & Hosting Providers +Edge App Hosting +Enterprise +E-Commerce +Gaming +IoT/IIoT +BigCommerce +Magento +WordPress +Drupal +Join our Slack community +Add to Slack +Company +About +Careers +Legals +Resources +Blog +Case Studies +Content Library +Solution Briefs +Partners +Changelog +Support +Docs +Community Slack +Help & Support +Platform Status +Pricing +Section supports many open source projects including: + +varnish cache logo +cloud native computing foundation logo +the linux foundation logo +lf edge logo diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/Key Design of HDFS Architecture.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..f76135c40e11237c2acb283adfb44aac93ba9584 GIT binary patch literal 29696 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 a(m$u5{(<4&V9U?D@Vo#2m$tVr<$nOLksA{L literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design-relation.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design-relation.txt new file mode 100644 index 0000000..54c71d3 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design-relation.txt @@ -0,0 +1,527 @@ +1 Introduction ....................................................................................................................... 3 2 Assumptions and Goals ..................................................................................................... 3 2.1 Hardware Failure&3 2.2 Streaming Data Access&依赖 +1 Introduction ....................................................................................................................... 3 2 Assumptions and Goals ..................................................................................................... 3 2.1 Hardware Failure&3 2.3 Large Data set&依赖 +Dhruba Borthakur Table&contents&AGGREGATION +persistence&file system metadata ......................................................................... 7 7&AGGREGATION +Heartbeats&re-replication ....................................................... 8 8.2 cluster rebalancing ......................................................................................................&依赖 +........................................................................................................... 8 copyright � 2005&Apache Software Foundation&依赖 +Blocks&Hadoop Distributed File System&依赖 +Blocks&.................................................................................................................. 9 9.2 staging ........................................................................................................................ 10 9.3 pipelining .................................................................................................................... 10 10 accessibility .................................................................................................................. 10 10.1 dfsshell ................................................................................................................... 11 10.2 dfsadmin ................................................................................................................ 11 10.3 browser interface ...................................................................................................... 11 11 space reclamation ........................................................................................................ 11 11.1 file deletes&依赖 +Blocks&..................................................................................................................... 12&依赖 +8.4 metadata disk failure .................................................................................................. 9 8.5 snapshot ...................................................................................................................... 9 9 data organization ............................................................................................................. 9 9.1 datum&8.4 metadata disk failure .................................................................................................. 9 8.5 snapshot ...................................................................................................................... 9 9 data organization ............................................................................................................. 9 9.1 datum&依赖 +It&many similarity&依赖 +It&distributed file system&依赖 +application&large dataset&依赖 +hdf&few POSIX requirement&依赖 +hdf&infrastructure&依赖 +hdf&open source web crawler Apache Nutch project&依赖 +part&Lucene Apache Project&AGGREGATION +part&Hadoop Project&AGGREGATION +hdf&Hadoop Project&依赖 +Hardware Failure Hardware Failure&exception&依赖 +entire HDFS file system&server machine&依赖 +server machine&file system datum&依赖 +hundreds or thousand&server machine&AGGREGATION +server machine&piece&依赖 +entire HDFS file system&hundreds or thousand&依赖 +piece&file system datum&AGGREGATION +huge number&component&AGGREGATION +non-trivial probability&failure&AGGREGATION +component&failure&依赖 +component&non-trivial probability&依赖 +component&hdf&AGGREGATION +detection&hdf&依赖 +core architectural goal&hdf&AGGREGATION +detection&hdf&依赖 +detection&fault&AGGREGATION +their&data& +hdf&batch processing&依赖 +emphasis&latency&依赖 +latency&data access&AGGREGATION +emphasis&data access&依赖 +throughput&data access&AGGREGATION +emphasis&data access&依赖 +POSIX&many hard requirement&依赖 +Large Data Sets application&large data set&依赖 +hundred&node&AGGREGATION +It&ten&依赖 +It&file&依赖 +It&million&依赖 +It&single cluster&依赖 +million&file&AGGREGATION +ten&million&AGGREGATION +design page 3 copyright � 2005&Apache Software Foundation&依赖 +Most HDFS application&write-once-read-many access model&依赖 +Most HDFS application&file&依赖 +assumption&data coherency issue&实现 +Map-Reduce application&model&依赖 +Map-Reduce application&application&GENERALIZATION +size&data set&AGGREGATION +network congestion and increase overall throughput&system&AGGREGATION +Portability&portable&依赖 +Portability&such a way&依赖 +it&one platform&依赖 +platform&choice&AGGREGATION +widespread adoption&hdf&AGGREGATION +large set&application&AGGREGATION +namenode and datanode hdfs&master/slave architecture&依赖 +master/slave architecture&architecture&GENERALIZATION +HDFS cluster&master server&依赖 +master server&filesystem namespace&依赖 +HDFS cluster&cluster&GENERALIZATION +HDFS cluster&single Namenode&依赖 +number and one&addition&依赖 +number and one&addition&依赖 +number and one&addition&依赖 +number and one&addition&依赖 +number and one&Datanodes&AGGREGATION +cluster&storage&依赖 +hdf&a file system namespace&依赖 +set&Datanodes&AGGREGATION +file&one or more block&依赖 +block&set&依赖 +block&Datanodes&依赖 +etc.&files and directory&AGGREGATION +Namenode&filesystem namespace operation&依赖 +mapping&block&AGGREGATION +It&mapping&依赖 +It&Datanodes&依赖 +Datanodes&block creation&依赖 +block creation&creation&GENERALIZATION +Datanodes&instruction&依赖 +Datanodes&Namenode&依赖 +Namenode and Datanode&software&依赖 +piece&software&AGGREGATION +machine&Java&依赖 +machine&Namenode&依赖 +Usage&portable Java language&AGGREGATION +wide range&machine&AGGREGATION +dedicated machine&machine&GENERALIZATION +Namenode software&software&GENERALIZATION +typical deployment&dedicated machine&依赖 +dedicated machine&Namenode software&依赖 +one instance&Datanode software&AGGREGATION +Datanode software&software&GENERALIZATION +design page 4 copyright � 2005&Apache Software Foundation&依赖 +existence&single Namenode&AGGREGATION +existence&architecture&实现 +existence&system&实现 +architecture&system&AGGREGATION +Namenode&HDFS metada&依赖 +system&flows&依赖 +system&such a way&依赖 +user datum&Namenode&依赖 +File System Namespace hdf&traditional hierarchical file organization&依赖 +user&directory&依赖 +user&directory and store file&依赖 +file system namespace hierarchy&most other existing file system&依赖 +One&file&依赖 +hdf&user quota&实现 +hdf&hard link&依赖 +HDFS architecture&feature&实现 +HDFS architecture&architecture&GENERALIZATION +Namenode&file system namespace&依赖 +change&Namenode&依赖 +number&replica&AGGREGATION +application&number&依赖 +replica&file&AGGREGATION +number&file&AGGREGATION +application&file&依赖 +copy&file&AGGREGATION +number©&AGGREGATION +replication factor&file&AGGREGATION +information&Namenode&依赖 +It&file&依赖 +It&sequence&依赖 +sequence&block&AGGREGATION +It&block&依赖 +Blocks&fault tolerance&依赖 +block size and replication factor&file&依赖 +application&file&依赖 +application&replica&依赖 +replication&block&AGGREGATION +Namenode&replication&依赖 +Namenode&block&依赖 +Namenode&decision&依赖 +receipt&heartbeat&AGGREGATION +list&block&AGGREGATION +Blockreport&list&依赖 +Blockreport&Datanode&依赖 +Blockreport&block&依赖 +selection&placement&AGGREGATION +placement&replica&AGGREGATION +feature&most other distributed file system&依赖 +feature&hdf&依赖 +lot&tuning and experience&AGGREGATION +feature&lot&依赖 +feature&tuning and experience&依赖 +purpose&rack-aware replica placement&AGGREGATION +purpose&data reliability&依赖 +design page 5 copyright � 2005&Apache Software Foundation&依赖 +implementation&direction&依赖 +implementation&direction&依赖 +short-term goal&it&依赖 +its&behavior& +hdf&cluster&依赖 +hdf&computer&依赖 +cluster&computer&AGGREGATION +Datanode&rack&依赖 +Datanode&startup time&依赖 +Namenode&rack id&AGGREGATION +rack identity&machine&AGGREGATION +simple but non-optimal policy&replica&依赖 +entire rack&multiple rack&依赖 +entire rack&use&依赖 +use&bandwidth&AGGREGATION +component failure&failure&GENERALIZATION +policy&cluster&依赖 +it&load&依赖 +policy&replica&依赖 +it&component failure&依赖 +write&block&依赖 +policy&cost&依赖 +HDFS.s placement policy&one replica&依赖 +inter-rack write traffic&inter-rack write traffic&依赖 +policy cut&performance&依赖 +chance&rack failure&AGGREGATION +policy&impact datum reliability and availability guarantee&依赖 +it&aggregate network bandwidth&依赖 +datum&three&依赖 +datum&two unique rack&依赖 +replica&rack&依赖 +other one third&replica&AGGREGATION +two third&replica&AGGREGATION +One third&replica&AGGREGATION +other one third&rack&依赖 +policy&performance&依赖 +implementation&above policy&AGGREGATION +Replica Selection hdf&read request&依赖 +Replica Selection hdf&replica&依赖 +HDFS cluster&multiple data center&依赖 +replica&remote replica&依赖 +Namenode&special state&依赖 +Namenode&special state&依赖 +Replication&data block&AGGREGATION +design page 6 copyright � 2005&Apache Software Foundation&依赖 +Namenode&Heartbeat The Hadoop Distributed File System&依赖 +Blockreport&data block&依赖 +Blockreport&Namenode&依赖 +list&data block&AGGREGATION +a datanode report&Namenode&依赖 +a datanode report&Namenode&依赖 +Blockreport&a datanode report&依赖 +block&replica&依赖 +block&specified minimum number&依赖 +specified minimum number&replica&AGGREGATION +data block&block&GENERALIZATION +replica&data block&AGGREGATION +minimum number&replica&AGGREGATION +configurable percentage&safely-replicated data block&AGGREGATION +namenode exit&Safemode state&依赖 +namenode exit&Safemode state&依赖 +namenode exit&Safemode state&依赖 +namenode exit&Safemode state&依赖 +It&list&依赖 +It&data block&依赖 +It&)&依赖 +specified number&replica&AGGREGATION +Namenode&block&依赖 +Namenode&other datanode&依赖 +HDFS namespace&Namenode&依赖 +Persistence&File System Metadata&AGGREGATION +Namenode&transaction log&依赖 +Namenode&EditLog&依赖 +Namenode&system metada&依赖 +Namenode&file&依赖 +Namenode&local file system&依赖 +its&system& +entire file system namespace&FsImage&依赖 +entire file system namespace&file&依赖 +Namenode.s local file system&local file system&GENERALIZATION +FsImage&Namenode.s local file system&依赖 +Namenode&memory&依赖 +Namenode&entire file system namespace and file blockmap&依赖 +image&entire file system namespace and file blockmap&AGGREGATION +large number&files and directory&AGGREGATION +Namenode machine&machine&GENERALIZATION +in-memory representation&FsImage&AGGREGATION +it&FsImage and EditLog&依赖 +it&disk&依赖 +It&old EditLog&依赖 +transaction&persistent FsImage&依赖 +its&transactions& +checkpoint¤t implementation&依赖 +Work&periodic checkpointing&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +Datanode&knowledge&依赖 +Datanode&HDFS file&依赖 +It&HDFS datum&依赖 +It&block&依赖 +It&HDFS datum&依赖 +block&HDFS datum&AGGREGATION +It&block&依赖 +It&block&依赖 +It&HDFS datum&依赖 +Datanode&file&依赖 +Datanode&same directory&依赖 +optimal number&file&AGGREGATION +it&heuristic&依赖 +It&subdirectory&依赖 +It&local file&依赖 +local file system&single directory&依赖 +local file system&huge number&依赖 +huge number&file&AGGREGATION +It&same directory&依赖 +list&HDFS data block&AGGREGATION +it&local file system&依赖 +Communication Protocol All communication protocol&TCP/IP protocol&依赖 +top&TCP/IP protocol&AGGREGATION +Communication Protocol All communication protocol&top&依赖 +client&Namenode machine&依赖 +client&connection&依赖 +client&well-defined and configurable port&依赖 +It&Namenode&依赖 +It&ClientProtocol&依赖 +Datanodes&DatanodeProtocol&依赖 +Datanodes&Namenode&依赖 +( rpc ) abstraction&ClientProtocol&依赖 +Namenode&RPC&依赖 +Namenode&design&依赖 +It&RPC request&依赖 +robustness primary objective&hdf&AGGREGATION +robustness primary objective&datum&依赖 +presence&failure&AGGREGATION +three type&common failure&AGGREGATION +Data Disk Failure&Namenode&依赖 +Data Disk Failure&heartbeat message&依赖 +network partition&subset&依赖 +network partition&Datanodes&依赖 +subset&Datanodes&AGGREGATION +lack&heartbeat message&AGGREGATION +namenode mark&datanode&依赖 +namenode mark&datanode&依赖 +datum&hdf&依赖 +replication factor&block&AGGREGATION +their&value& +Namenode&block&依赖 +increase&replication factor&AGGREGATION +HDFS architecture&data rebalancing scheme&依赖 +free space&certain threshold&依赖 +free space&certain threshold&依赖 +sudden high demand&other datum&依赖 +sudden high demand&creation&依赖 +sudden high demand&cluster&依赖 +creation&additional replicas and rebalancing&AGGREGATION +additional replicas and rebalancing&other datum&AGGREGATION +sudden high demand&additional replicas and rebalancing&依赖 +sudden high demand&additional replicas and rebalancing&依赖 +sudden high demand&cluster&依赖 +sudden high demand&other datum&依赖 +sudden high demand&creation&依赖 +type&scheme&AGGREGATION +block&datum&AGGREGATION +design page 8 copyright � 2005&Apache Software Foundation&依赖 +HDFS client&HDFS file&实现 +contents&HDFS file&AGGREGATION +HDFS file&file&GENERALIZATION +HDFS client&checksum checking&实现 +HDFS client&contents&实现 +HDFS client&client&GENERALIZATION +it&checksum&依赖 +it&block&依赖 +it&block&依赖 +it&checksum&依赖 +it&checksum&依赖 +it&block&依赖 +it&block&依赖 +checksum&block&AGGREGATION +client&HDFS file&依赖 +it&checksum&依赖 +file contents&contents&GENERALIZATION +it&checksum&依赖 +client&file contents&依赖 +replica&block&AGGREGATION +Datanode&replica&依赖 +Datanode&block&依赖 +central data structure&hdf&AGGREGATION +Metadata Disk Failure The FsImage&hdf&依赖 +corruption&file&AGGREGATION +corruption&entire cluster&依赖 +multiple copy&FsImage and EditLog&AGGREGATION +update&updated synchronously&依赖 +synchronous update&rate&依赖 +rate&namespace transaction&AGGREGATION +synchronous update&second&依赖 +synchronous update&namespace transaction&依赖 +synchronous update&multiple EditLog&AGGREGATION +Namenode&latest consistent FsImage and EditLog to use&依赖 +Namenode machine&HDFS cluster&依赖 +Namenode machine&failure&依赖 +single point&failure&AGGREGATION +automatic restart and failover&Namenode software&AGGREGATION +particular instant&time&AGGREGATION +copy&datum&AGGREGATION +snapshot snapshot©&依赖 +snapshot snapshot&support&依赖 +snapshot snapshot&datum&依赖 +One usage&snapshot-feature&AGGREGATION +One usage&corrupted cluster&依赖 +HDFS current&snapshot&依赖 +they&datum one or more time&依赖 +application&datum&依赖 +hdf&write-once-read-many semantics&依赖 +hdf&file&依赖 +chunk&different datanode&依赖 +HDFS client&file datum&依赖 +HDFS client&temporary local file&依赖 +HDFS client&fact&依赖 +local file&HDFS block size&依赖 +client contact&Namenode&依赖 +client contact&Namenode&依赖 +local file&data worth&依赖 +client contact&Namenode&依赖 +namenode insert&file name&依赖 +namenode insert&file system hierarchy&依赖 +namenode insert&file name&依赖 +namenode insert&file system hierarchy&依赖 +identity&datanode (&AGGREGATION +Namenode&identity&依赖 +Namenode&datanode (&依赖 +Namenode&client request&依赖 +client&datum&依赖 +client&block&依赖 +client&datum&依赖 +client&datum&依赖 +client&block&依赖 +client&block&依赖 +un-flushed datum&Datanode&依赖 +client&Namenode&依赖 +Namenode&persistent store&依赖 +Namenode&point&依赖 +Namenode&file creation operation&依赖 +careful consideration&target application&AGGREGATION +above approach&target application&依赖 +above approach&careful consideration&依赖 +application&streaming write&依赖 +application&file&依赖 +network speed&writes&依赖 +client&client side buffering&依赖 +client&remote file&依赖 +network speed&network impact throughput&依赖 +e.g. AFS&client side caching&依赖 +e.g. AFS&earlier distribute file system&依赖 +higher performance&data upload&AGGREGATION +POSIX requirement&data upload&依赖 +POSIX requirement&higher performance&依赖 +client&datum&依赖 +client&HDFS file&依赖 +its&data& +datum&local file&依赖 +HDFS file&replication factor&依赖 +replication factor&three&AGGREGATION +HDFS file&three&依赖 +client&list&依赖 +local file&block&依赖 +local file&user datum&依赖 +list&Datanodes&AGGREGATION +block&user datum&AGGREGATION +client&Namenode&依赖 +Datanodes&replica&依赖 +list&Datanodes&依赖 +Datanodes&block&依赖 +client&first Datanode&依赖 +client&data block&依赖 +its&repository& +first Datanode&datum&依赖 +portion&data block&AGGREGATION +second Datanode&data block&依赖 +second Datanode&portion&依赖 +third Datanode&datum&依赖 +third Datanode&local repository&依赖 +it&next one&依赖 +Datanode&pipeline&依赖 +it&pipeline&依赖 +Datanode&datum&依赖 +it&same time&依赖 +Datanode&previous one&依赖 +datum&one Datanode&依赖 +datum&next&依赖 +Accessibility hdf&application&依赖 +Accessibility hdf&many different way&依赖 +design page 10 copyright � 2005&Apache Software Foundation&依赖 +DFSShell hdf&user datum&依赖 +form&files and directory&AGGREGATION +DFSShell&user interact&依赖 +syntax&command set&AGGREGATION +application&language&依赖 +directory&/ foodir&依赖 +command syntax&application&依赖 +browser interface a typical hdf&web-server&依赖 +hdf namespace and view contents&HDFS file&AGGREGATION +file&user&依赖 +it&hdf&依赖 +hdf&/ trash directory&依赖 +hdf&it&依赖 +hdf&file&依赖 +design page 11 copyright � 2005&Apache Software Foundation&依赖 +file&configurable amount&依赖 +configurable amount&time&AGGREGATION +file&/ trash&依赖 +file&time&依赖 +expiry&life&AGGREGATION +Namenode&/ trash&依赖 +Namenode&file&依赖 +Namenode&HDFS namespace&依赖 +Namenode&file&依赖 +its&life& +deletion&block&依赖 +deletion&file&AGGREGATION +time&corresponding increase&AGGREGATION +user&file&依赖 +it&/ trash directory&依赖 +user&file&依赖 +he/she&that&依赖 +he/she&/ trash directory&依赖 +/ trash directory&file&依赖 +/ trash directory&latest copy&依赖 +latest copy&file&AGGREGATION +hdf&directory&依赖 +/ trash directory&one special feature&依赖 +hdf&policy&依赖 +hdf&file&依赖 +current default policy&file&依赖 +policy&future&依赖 +policy&defined interface&依赖 +Namenode&excess replica&依赖 +next heartbeat transfer&information&依赖 +corresponding free space&cluster&依赖 +Datanode&corresponding block&依赖 +completion&setReplication apus&AGGREGATION +appearance&free space&AGGREGATION +hdf source code&Hadoop Distributed File System&依赖 +design page 12 copyright � 2005&Apache Software Foundation&依赖 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt new file mode 100644 index 0000000..5cbf209 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt @@ -0,0 +1,380 @@ +The Hadoop Distributed File System: +Architecture and Design +by Dhruba Borthakur +Table of contents +1 Introduction .......................................................................................................................3 +2 Assumptions and Goals .....................................................................................................3 +2.1 Hardware Failure........................................................................................................... 3 +2.2 Streaming Data Access .................................................................................................3 +2.3 Large Data Sets .............................................................................................................3 +2.4 Simple Coherency Model ............................................................................................. 3 +2.5 Moving computation is cheaper than moving data .......................................................4 +2.6 Portability across Heterogeneous Hardware and Software Platforms ..........................4 +3 Namenode and Datanode .................................................................................................. 4 +4 The File System Namespace .............................................................................................5 +5 Data Replication ................................................................................................................5 +5.1 Replica Placement . The First Baby Steps ....................................................................5 +5.2 Replica Selection .......................................................................................................... 6 +5.3 SafeMode ......................................................................................................................6 +6 The Persistence of File System Metadata ......................................................................... 7 +7 The Communication Protocol ........................................................................................... 8 +8 Robustness ........................................................................................................................ 8 +8.1 Data Disk Failure, Heartbeats and Re-Replication .......................................................8 +8.2 Cluster Rebalancing ......................................................................................................8 +8.3 Data Correctness ...........................................................................................................8 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +8.4 Metadata Disk Failure .................................................................................................. 9 +8.5 Snapshots ......................................................................................................................9 +9 Data Organization ............................................................................................................. 9 +9.1 Data Blocks .................................................................................................................. 9 +9.2 Staging ........................................................................................................................10 +9.3 Pipelining ....................................................................................................................10 +10 Accessibility .................................................................................................................. 10 +10.1 DFSShell ...................................................................................................................11 +10.2 DFSAdmin ................................................................................................................11 +10.3 Browser Interface ......................................................................................................11 +11 Space Reclamation ........................................................................................................ 11 +11.1 File Deletes and Undelete ......................................................................................... 11 +11.2 Decrease Replication Factor ..................................................................................... 12 +12 References ..................................................................................................................... 12 +The Hadoop Distributed File System: Architecture and Design +Page 2 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +1. Introduction +The Hadoop File System (HDFS) is as a distributed file system running on commodity +hardware. It has many similarities with existing distributed file systems. However, the +differences from other distributed file systems are significant. HDFS is highly fault-tolerant +and can be deployed on low-cost hardware. HDFS provides high throughput access to +application data and is suitable for applications that have large datasets. HDFS relaxes a few +POSIX requirements to enable streaming access to file system data. HDFS was originally +built as infrastructure for the open source web crawler Apache Nutch project. HDFS is part +of the Hadoop Project, which is part of the Lucene Apache Project. The Project URL is here. +2. Assumptions and Goals +2.1. Hardware Failure +Hardware Failure is the norm rather than the exception. The entire HDFS file system may +consist of hundreds or thousands of server machines that stores pieces of file system data. +The fact that there are a huge number of components and that each component has a +non-trivial probability of failure means that some component of HDFS is always +non-functional. Therefore, detection of faults and automatically recovering quickly from +those faults are core architectural goals of HDFS. +2.2. Streaming Data Access +Applications that run on HDFS need streaming access to their data sets. They are not general +purpose applications that typically run on a general purpose file system. HDFS is designed +more for batch processing rather than interactive use by users. The emphasis is on throughput +of data access rather than latency of data access. POSIX imposes many hard requirements +that are not needed for applications that are targeted for HDFS. POSIX semantics in a few +key areas have been traded off to further enhance data throughout rates. +2.3. Large Data Sets +Applications that run on HDFS have large data sets. This means that a typical file in HDFS is +gigabytes to terabytes in size. Thus, HDFS is tuned to support large files. It should provide +high aggregate data bandwidth and should scale to hundreds of nodes in a single cluster. It +should support tens of millions of files in a single cluster. +2.4. Simple Coherency Model +The Hadoop Distributed File System: Architecture and Design +Page 3 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +Most HDFS applications need write-once-read-many access model for files. A file once +created, written and closed need not be changed. This assumption simplifies data coherency +issues and enables high throughout data access. A Map-Reduce application or a +Web-Crawler application fits perfectly with this model. There is a plan to support +appending-writes to a file in future. +2.5. Moving computation is cheaper than moving data +A computation requested by an application is most optimal if the computation can be done +near where the data is located. This is especially true when the size of the data set is huge. +This eliminates network congestion and increase overall throughput of the system. The +assumption is that it is often better to migrate the computation closer to where the data is +located rather than moving the data to where the application is running. HDFS provides +interfaces for applications to move themselves closer to where the data is located. +2.6. Portability across Heterogeneous Hardware and Software Platforms +HDFS should be designed in such a way that it is easily portable from one platform to +another. This facilitates widespread adoption of HDFS as a platform of choice for a large set +of applications. +3. Namenode and Datanode +HDFS has a master/slave architecture. An HDFS cluster consists of a single Namenode, a +master server that manages the filesystem namespace and regulates access to files by clients. +In addition, there are a number of Datanodes, one per node in the cluster, which manage +storage attached to the nodes that they run on. HDFS exposes a file system namespace and +allows user data to be stored in files. Internally, a file is split into one or more blocks and +these blocks are stored in a set of Datanodes. The Namenode makes filesystem namespace +operations like opening, closing, renaming etc. of files and directories. It also determines the +mapping of blocks to Datanodes. The Datanodes are responsible for serving read and write +requests from filesystem clients. The Datanodes also perform block creation, deletion, and +replication upon instruction from the Namenode. +The Namenode and Datanode are pieces of software that run on commodity machines. These +machines are typically commodity Linux machines. HDFS is built using the Java language; +any machine that support Java can run the Namenode or the Datanode. Usage of the highly +portable Java language means that HDFS can be deployed on a wide range of machines. A +typical deployment could have a dedicated machine that runs only the Namenode software. +Each of the other machines in the cluster runs one instance of the Datanode software. The +The Hadoop Distributed File System: Architecture and Design +Page 4 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +architecture does not preclude running multiple Datanodes on the same machine but in a +real-deployment that is never the case. +The existence of a single Namenode in a cluster greatly simplifies the architecture of the +system. The Namenode is the arbitrator and repository for all HDFS metadata. The system is +designed in such a way that user data never flows through the Namenode. +4. The File System Namespace +HDFS supports a traditional hierarchical file organization. A user or an application can create +directories and store files inside these directories. The file system namespace hierarchy is +similar to most other existing file systems. One can create and remove files, move a file from +one directory to another, or rename a file. HDFS does not yet implement user quotas and +access permissions. HDFS does not support hard links and soft links. However, the HDFS +architecture does not preclude implementing these features at a later time. +The Namenode maintains the file system namespace. Any change to the file system +namespace and properties are recorded by the Namenode. An application can specify the +number of replicas of a file that should be maintained by HDFS. The number of copies of a +file is called the replication factor of that file. This information is stored by the Namenode. +5. Data Replication +HDFS is designed to reliably store very large files across machines in a large cluster. It stores +each file as a sequence of blocks; all blocks in a file except the last block are the same size. +Blocks belonging to a file are replicated for fault tolerance. The block size and replication +factor are configurable per file. Files in HDFS are write-once and have strictly one writer at +any time. An application can specify the number of replicas of a file. The replication factor +can be specified at file creation time and can be changed later. +The Namenode makes all decisions regarding replication of blocks. It periodically receives +Heartbeat and a Blockreport from each of the Datanodes in the cluster. A receipt of a +heartbeat implies that the Datanode is in good health and is serving data as desired. A +Blockreport contains a list of all blocks on that Datanode. +5.1. Replica Placement . The First Baby Steps +The selection of placement of replicas is critical to HDFS reliability and performance. This +feature distinguishes HDFS from most other distributed file systems. This is a feature that +needs lots of tuning and experience. The purpose of a rack-aware replica placement is to +improve data reliability, availability, and network bandwidth utilization. The current +The Hadoop Distributed File System: Architecture and Design +Page 5 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +implementation for the replica placement policy is a first effort in this direction. The +short-term goals of implementing this policy are to validate it on production systems, learn +more about its behavior and build a foundation to test and research more sophisticated +policies in the future. +HDFS runs on a cluster of computers that spread across many racks. Communication +between two nodes on different racks has to go through switches. In most cases, network +bandwidth between two machines in the same rack is greater than network bandwidth +between two machines on different racks. +At startup time, each Datanode determines the rack it belongs to and notifies the Namenode +of the rack id upon registration. HDFS provides APIs to facilitate pluggable modules that can +be used to determine the rack identity of a machine. A simple but non-optimal policy is to +place replicas across racks. This prevents losing data when an entire rack fails and allows use +of bandwidth from multiple racks when reading data. This policy evenly distributes replicas +in the cluster and thus makes it easy to balance load on component failure. However, this +policy increases the cost of writes because a write needs to transfer blocks to multiple racks. +For the most common case when the replica factor is three, HDFS.s placement policy is to +place one replica on the local node, place another replica on a different node at the local rack, +and place the last replica on different node at a different rack. This policy cuts the inter-rack +write traffic and improves write performance. The chance of rack failure is far less than that +of node failure; this policy does not impact data reliability and availability guarantees. But it +reduces the aggregate network bandwidth when reading data since a block is placed in only +two unique racks rather than three. The replicas of a file do not evenly distribute across the +racks. One third of replicas are on one node, two thirds of the replicas are on one rack; the +other one third of replicas is evenly distributed across all the remaining racks. This policy +improves write performance while not impacting data reliability or read performance. +The implementation of the above policy is work-in-progress. +5.2. Replica Selection +HDFS tries to satisfy a read request from a replica that is closest to the reader. If there exists +a replica on the same rack as the reader node, then that replica is preferred to satisfy the read +request. If a HDFS cluster spans multiple data centers, then a replica that is resident in the +local data center is preferred over remote replicas. +5.3. SafeMode +On startup, the Namenode enters a special state called Safemode. Replication of data blocks +does not occur when the Namenode is in Safemode state. The Namenode receives Heartbeat +The Hadoop Distributed File System: Architecture and Design +Page 6 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +and Blockreport from the Datanodes. A Blockreport contains the list of data blocks that a +Datanode reports to the Namenode. Each block has a specified minimum number of replicas. +A block is considered safely-replicated when the minimum number of replicas of that data +block has checked in with the Namenode. When a configurable percentage of +safely-replicated data blocks checks in with the Namenode (plus an additional 30 seconds), +the Namenode exits the Safemode state. It then determines the list of data blocks (if any) that +have fewer than the specified number of replicas. The Namenode then replicates these blocks +to other Datanodes. +6. The Persistence of File System Metadata +The HDFS namespace is stored by the Namenode. The Namenode uses a transaction log +called the EditLog to persistently record every change that occurs to file system metadata. +For example, creating a new file in HDFS causes the Namenode to insert a record into the +EditLog indicating this change. Similarly, changing the replication factor of a file causes a +new record to be inserted into the EditLog. The Namenode uses a file in its local file system +to store the Edit Log. The entire file system namespace, the mapping of blocks to files and +filesystem properties are stored in a file called the FsImage. The FsImage is a file in the +Namenode.s local file system too. +The Namenode has an image of the entire file system namespace and file Blockmap in +memory. This metadata is designed to be compact, so that a 4GB memory on the Namenode +machine is plenty to support a very large number of files and directories. When the +Namenode starts up, it reads the FsImage and EditLog from disk, applies all the transactions +from the EditLog into the in-memory representation of the FsImage and then flushes out this +new metadata into a new FsImage on disk. It can then truncate the old EditLog because its +transactions have been applied to the persistent FsImage. This process is called a checkpoint. +In the current implementation, a checkpoint occurs when the Namenode starts up. Work is in +progress to support periodic checkpointing in the near future. +The Datanode stores HDFS data into files in its local file system. The Datanode has no +knowledge about HDFS files. It stores each block of HDFS data in a separate file in its local +file system. The Datanode does not create all files in the same directory. Instead, it uses a +heuristic to determine the optimal number of files per directory. It creates subdirectories +appropriately. It is not optimal to create all local files in the same directory because the local +file system might not be able to efficiently support a huge number of files in a single +directory. When a Datanode starts up, it scans through its local file system, generates a list of +all HDFS data blocks that correspond to each of these local files and sends this report to the +Namenode. This report is called the Blockreport. +The Hadoop Distributed File System: Architecture and Design +Page 7 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +7. The Communication Protocol +All communication protocols are layered on top of the TCP/IP protocol. A client establishes +a connection to a well-defined and configurable port on the Namenode machine. It talks the +ClientProtocol with the Namenode. The Datanodes talk to the Namenode using the +DatanodeProtocol. The details on these protocols will be explained later on. A Remote +Procedure Call (RPC) abstraction wraps the ClientProtocol and the DatanodeProtocol. By +design, the Namenode never initiates an RPC. It responds to RPC requests issued by a +Datanode or a client. +8. Robustness +The primary objective of HDFS is to store data reliably even in the presence of failures. The +three types of common failures are Namenode failures, Datanode failures and network +partitions. +8.1. Data Disk Failure, Heartbeats and Re-Replication +A Datanode sends a heartbeat message to the Namenode periodically. A network partition +can cause a subset of Datanodes to lose connectivity with the Namenode. The Namenode +detects this condition be a lack of heartbeat message. The Namenode marks these Datanodes +as dead and does not forward any new IO requests to these Datanodes. The data that was +residing on those Datanodes are not available to HDFS any more. This may cause the +replication factor of some blocks to fall below their specified value. The Namenode +determines all the blocks that need to be replicated and starts replicating them to other +Datanodes. The necessity for re-replication may arise due to many reasons: a Datanode +becoming unavailable, a corrupt replica, a bad disk on the Datanode or an increase of the +replication factor of a file. +8.2. Cluster Rebalancing +The HDFS architecture is compatible with data rebalancing schemes. It is possible that data +may move automatically from one Datanode to another if the free space on a Datanode falls +below a certain threshold. Also, a sudden high demand for a particular file can dynamically +cause creation of additional replicas and rebalancing of other data in the cluster. These types +of rebalancing schemes are not yet implemented. +8.3. Data Correctness +It is possible that a block of data fetched from a Datanode is corrupted. This corruption can +The Hadoop Distributed File System: Architecture and Design +Page 8 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +occur because of faults in the storage device, a bad network or buggy software. The HDFS +client implements checksum checking on the contents of a HDFS file. When a client creates a +HDFS file, it computes a checksum of each block on the file and stores these checksums in a +separate hidden file in the same HDFS namespace. When a client retrieves file contents it +verifies that the data it received from a Datanode satisfies the checksum stored in the +checksum file. If not, then the client can opt to retrieve that block from another Datanode that +has a replica of that block. +8.4. Metadata Disk Failure +The FsImage and the EditLog are central data structures of HDFS. A corruption of these files +can cause the entire cluster to be non-functional. For this reason, the Namenode can be +configured to support multiple copies of the FsImage and EditLog. Any update to either the +FsImage or EditLog causes each of the FsImages and EditLogs to get updated synchronously. +This synchronous updating of multiple EditLog may degrade the rate of namespace +transactions per second that a Namenode can support. But this degradation is acceptable +because HDFS applications are very data intensive in nature; they are not metadata intensive. +A Namenode, when it restarts, selects the latest consistent FsImage and EditLog to use. +The Namenode machine is a single point of failure for the HDFS cluster. If a Namenode +machine fails, manual intervention is necessary. Currently, automatic restart and failover of +the Namenode software to another machine is not supported. +8.5. Snapshots +Snapshots support storing a copy of data at a particular instant of time. One usage of the +snapshot-feature may be to roll back a corrupted cluster to a previously known good point in +time. HDFS current does not support snapshots but it will be supported it in future release. +9. Data Organization +9.1. Data Blocks +HDFS is designed to support large files. Applications that are compatible with HDFS are +those that deal with large data sets. These applications write the data only once; they read the +data one or more times and require that reads are satisfied at streaming speeds. HDFS +supports write-once-read-many semantics on files. A typical block size used by HDFS is 64 +MB. Thus, a HDFS file is chopped up into 128MB chunks, and each chunk could reside in +different Datanodes. +The Hadoop Distributed File System: Architecture and Design +Page 9 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +9.2. Staging +A client-request to create a file does not reach the Namenode immediately. In fact, the HDFS +client caches the file data into a temporary local file. An application-write is transparently +redirected to this temporary local file. When the local file accumulates data worth over a +HDFS block size, the client contacts the Namenode. The Namenode inserts the file name into +the file system hierarchy and allocates a data block for it. The Namenode responds to the +client request with the identity of the Datanode(s) and the destination data block. The client +flushes the block of data from the local temporary file to the specified Datanode. When a file +is closed, the remaining un-flushed data in the temporary local file is transferred to the +Datanode. The client then instructs the Namenode that the file is closed. At this point, the +Namenode commits the file creation operation into a persistent store. If the Namenode dies +before the file is closed, the file is lost. +The above approach has been adopted after careful consideration of target applications that +run on HDFS. Applications need streaming writes to files. If a client writes to a remote file +directly without any client side buffering, the network speed and the congestion in the +network impacts throughput considerably. This approach is not without precedence either. +Earlier distributed file system, e.g. AFS have used client side caching to improve +performance. A POSIX requirement has been relaxed to achieve higher performance of data +uploads. +9.3. Pipelining +When a client is writing data to a HDFS file, its data is first written to a local file as +explained above. Suppose the HDFS file has a replication factor of three. When the local file +accumulates a block of user data, the client retrieves a list of Datanodes from the Namenode. +This list represents the Datanodes that will host a replica of that block. The client then +flushes the data block to the first Datanode. The first Datanode starts receiving the data in +small portions (4 KB), writes each portion to its local repository and transfers that portion to +the second Datanode in the list. The second Datanode, in turn, starts receiving each portion of +the data block, writes that portion to its repository and then flushes that portion to the third +Datanode. The third Datanode writes the data to its local repository. A Datanode could be +receiving data from the previous one in the pipeline and at the same time it could be +forwarding data to the next one in the pipeline. Thus, the data is pipelined from one Datanode +to the next. +10. Accessibility +HDFS can be accessed by application by many different ways. Natively, HDFS provides a +The Hadoop Distributed File System: Architecture and Design +Page 10 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +Java API for applications to use. A C language wrapper for this Java API is available. A +HTTP browser can also be used to browse the file in HDFS. Work is in progress to expose a +HDFS content repository through the WebDAV Protocol. +10.1. DFSShell +HDFS allows user data to be organized in the form of files and directories. It provides an +interface called DFSShell that lets a user interact with the data in HDFS. The syntax of this +command set is similar to other shells (e.g. bash, csh) that users are already familiar with. +Here are some sample commands: +Create a directory named /foodir : hadoop dfs -mkdir /foodir +View a file /foodir/myfile.txt : hadoop dfs -cat /foodir/myfile.txt +Delete a file /foodir/myfile.txt : hadoop dfs -rm /foodir myfile.txt +The command syntax for DFSShell is targeted for applications that need a scripting language +to interact with the stored data. +10.2. DFSAdmin +The DFSAdmin command set is used for administering a dfs cluster. These are commands +that are used only by a HDFS administrator. Here are some sample commands: +Put a cluster in Safe Mode : bin/hadoop dfsadmin -safemode enter +Generate a list of Datanodes : bin/hadoop dfsadmin -report +Decommission a Datanode : bin/hadoop dfsadmin -decommission datanodename +10.3. Browser Interface +A typical HDFS install configures a web-server to expose the HDFS namespace through a +configurable port. This allows a Web browser to navigate the HDFS namespace and view +contents of a HDFS file. +11. Space Reclamation +11.1. File Deletes and Undelete +When a file is deleted by a user or an application, it is not immediately removed from HDFS. +HDFS renames it to a file in the /trash directory. The file can be restored quickly as long as it +The Hadoop Distributed File System: Architecture and Design +Page 11 +Copyright © 2005 The Apache Software Foundation. All rights reserved. +remains in /trash. A file remains in /trash for a configurable amount of time. After the expiry +of its life in /trash, the Namenode deletes the file from the HDFS namespace. The deletion of +the file causes the blocks associated with the file to be freed. There could be an appreciable +time delay between the time a file is deleted by a user and the time of the corresponding +increase in free space in HDFS. +A user can Undelete a file after deleting it as long as it remains in the /trash directory. If a +user wants to undelete a file that he/she has deleted, he/she can navigate the /trash directory +and retrieve the file. The /trash directory contains only the latest copy of the file that was +deleted. The /trash directory is just like any other directory with one special feature: HDFS +applies specified policies to automatically delete files from this directory. The current default +policy is to delete files that are older than 6 hours. In future, this policy will be configurable +through a well defined interface. +11.2. Decrease Replication Factor +When the replication factor of a file is reduced, the Namenode selects excess replicas that can +be deleted. The next Heartbeat transfers this information to the Datanode. The Datanode then +removes the corresponding blocks and the corresponding free space appears in the cluster. +The point to note here is that there might be a time delay between the completion of the +setReplication API and the appearance of free space in the cluster. +12. References +Browse the HDFS Java Interface +Download the HDFS source code +The Hadoop Distributed File System: Architecture and Design +Page 12 +Copyright © 2005 The Apache Software Foundation. All rights reserved. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/The Hadoop Distributed File System Architecture and Design.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..9ca46f8638cdce70e740b411bfe7493707d7fadc GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture-relation.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture-relation.txt new file mode 100644 index 0000000..4bc48d6 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture-relation.txt @@ -0,0 +1,635 @@ +Scalable HDFS Architecture Farag Azzedin Information&corporation&依赖 +Computer Science Department King Fahd University&petroleum and minerals dhahran&AGGREGATION +Scalable HDFS Architecture Farag Azzedin Information&cost&依赖 +One&area&AGGREGATION +Apache Hadoop&large scale data processing project&依赖 +Apache Hadoop&Hadoop&GENERALIZATION +one&data-intensive distributed application&依赖 +one&large scale data processing project&AGGREGATION +Hadoop application&distributed file system&依赖 +Hadoop application&data storage&依赖 +data storage&storage&GENERALIZATION +Hadoop application&file system ( hdf )&依赖 +master node&node&GENERALIZATION +its&RAM& +HDFS architecture&architecture&GENERALIZATION +metada&storage node&AGGREGATION +HDFS architecture&single master node&依赖 +HDFS architecture&single master node&依赖 +NameNode&Datanodes&依赖 +HDFS&NameNode& +HDFS Datanodes ’ metada&’s single-point-of-failure namenode&依赖 +capacity&RAM&AGGREGATION +HDFS Datanodes ’ metada&RAM&依赖 +HDFS Datanodes ’ metada&capacity&依赖 +RAM&’s single-point-of-failure namenode&AGGREGATION +paper&fault tolerant , highly available and widely scalable HDFS architecture&依赖 +drawback¤t HDFS architecture&AGGREGATION +this motivated researcher&this motivated researcher&依赖 +this motivated researcher&mapreduce&依赖 +this motivated researcher&system&依赖 +Google&MapReduce& +Apache Hadoop&cloud computing project&依赖 +reliable and scalable datum intensive distribute computing [ 2 , 3 , 4 ]&aiming&依赖 +one&cloud computing project&AGGREGATION +reliable and scalable datum intensive distribute computing [ 2 , 3 , 4 ]&Java&依赖 +its&applications& +HDFS implementation&even thousand&依赖 +HDFS implementation&server machine&依赖 +even thousand&server machine&AGGREGATION +system&data& +part&’s datum&AGGREGATION +HDFS implementation&implementation&GENERALIZATION +thus high probability&hardware failure&AGGREGATION +more server machine&more hardware&依赖 +component&hdf&AGGREGATION +faults detection&hdf [ 3 , 7 ]&依赖 +fundamental architectural goal&hdf [ 3 , 7 ]&AGGREGATION +same&HDFS cluster&依赖 +same&NameNode server&依赖 +HDFS cluster&cluster&GENERALIZATION +HDFS&performance& +availability&single NameNode machine&AGGREGATION +automatic restart and failover&NameNode software&AGGREGATION +Hadoop applications utilize HDFS [ 7 ]&Datanodes&依赖 +Hadoop applications utilize HDFS [ 7 ]&RAM [ 7 ]&依赖 +Hadoop applications utilize HDFS [ 7 ]&single master node&依赖 +Hadoop applications utilize HDFS [ 7 ]&NameNode&依赖 +its&]& +paper&NameNode&依赖 +case&single NameNode failure&AGGREGATION +HDFS NameNode&NameNode&GENERALIZATION +Several research project&Chord&依赖 +Several research project&basis&依赖 +Several research project&research&依赖 +their&research& +chord file system ( cfs ) store file&peer-to-peer system&依赖 +chord file system ( cfs ) store file&chord file system ( cfs ) store file&依赖 +chord file system ( cfs ) store file&peer-to-peer system&依赖 +chord file system ( cfs ) store file&peer-to-peer system&依赖 +chord file system ( cfs ) store file&peer-to-peer system&依赖 +chord file system ( cfs ) store file&chord file system ( cfs ) store file&依赖 +chord file system ( cfs ) store file&chord file system ( cfs ) store file&依赖 +chord file system ( cfs ) store file&chord file system ( cfs ) store file&依赖 +Chord&algorithms& +value&[ 9 ]&依赖 +set&special root server&AGGREGATION +ordinary dn&set&依赖 +Chord-based dn&special server&依赖 +ordinary dn&special root server&依赖 +route information ( n record&name server hierarchy&依赖 +correctness&analogous route information [ 9 ]&AGGREGATION +dn&route information ( n record&依赖 +Chord&analogous route information [ 9 ]&依赖 +dn&manual management&依赖 +route information ( n record&client&依赖 +Chord&correctness&依赖 +manual management&route information ( n record&AGGREGATION +Chord&no name structure [ 9 ]&依赖 +dn&named hosts or service&依赖 +dn&task&依赖 +rest&follow&依赖 +rest&paper&AGGREGATION +Hadoop architecture&Section II&依赖 +Hadoop architecture&architecture&GENERALIZATION +Section IV&problem statement&依赖 +we¤t Hadoop architecture&依赖 +we¤t Hadoop architecture&依赖 +we&issue&依赖 +we¤t Hadoop architecture&依赖 +we&issue&依赖 +its&NameNode& +our&motivation& +we&issue&依赖 +area&future work&AGGREGATION +We&Section vius&依赖 +HADOOP ARCHITECTURE Hadoop&several sub-project&依赖 +MapReduce&4 ]&依赖 +HADOOP ARCHITECTURE Hadoop&hadoop common hdfs&依赖 +MapReduce&4 ]&依赖 +this section briefly&sub-project&依赖 +this section briefly&Hadoop namely Hadoop Common&依赖 +sub-project&Hadoop namely Hadoop Common&AGGREGATION +Hadoop Common&Filesystem&依赖 +contribution area&3 ]&依赖 +contribution area&other Hadoop community project&依赖 +its&storage& +Kosmos Distributed File System )&[ 3 ]&依赖 +Kosmos Distributed File System )&[ 3 ]&依赖 +ten&petabyte&AGGREGATION +petabyte&storage&AGGREGATION +hdf&OS [ 3 ]&依赖 +hdf&top&依赖 +filesystem&OS [ 3 ]&AGGREGATION +hdf&filesystem&依赖 +top&filesystem&AGGREGATION +hdf&Java language [ 3 ]&依赖 +master/slave architecture&architecture&GENERALIZATION +hdf&master/slave architecture&依赖 +typical Hadoop cluster&NameNode&依赖 +NameNode&HDFS namespace&依赖 +Datanodes&actual datum&依赖 +machine&GNU/Linux OS&依赖 +machine&Java&依赖 +hdf&machine&依赖 +Usage&portable and all pervasive Java language&AGGREGATION +wide range&machine&AGGREGATION +dedicated machine&machine&GENERALIZATION +dedicated machine&NameNode software&依赖 +typical deployment&dedicated machine&依赖 +one instance&Datanode software&AGGREGATION +architecture&multiple datanode&依赖 +MapReduce&huge data set&依赖 +MapReduce&its simplicity and functionality [&依赖 +MapReduce&7 ]&实现 +huge data set&distributed application&AGGREGATION +its&simplicity& +MapReduce&distributed application&依赖 +integral part&Hadoop&AGGREGATION +It&large data set&依赖 +It&distributed computing&依赖 +cluster&computer&AGGREGATION +It&computer&依赖 +It&cluster&依赖 +MapReduce&datum&依赖 +master node&major input&依赖 +master node&typical ― Map ‖ function&依赖 +worker node&process&依赖 +worker node&node&GENERALIZATION +worker node&received problem chunk&依赖 +master node&" Reduce " function&依赖 +master node&processed sub-problem&依赖 +part&Hadoop project&AGGREGATION +it&map and reduction operation&依赖 +it&unnoticed distributed processing&依赖 +unnoticed distributed processing&map and reduction operation&AGGREGATION +multiple map function¶llel&依赖 +number&CPUs&AGGREGATION +output&same reducer&依赖 +map operation&operation&GENERALIZATION +map operation&same key&依赖 +set&' reducer&AGGREGATION +output&map operation&AGGREGATION +MapReduce&larger dataset&依赖 +MapReduce&handle&依赖 +petabyte&datum&AGGREGATION +parallelism&high availability&依赖 +parallelism&probability&依赖 +parallelism&probability&依赖 +parallelism&high availability&依赖 +case&partial failure&AGGREGATION +parallelism&probability&依赖 +probability&high availability&AGGREGATION +partial failure&servers or storage&AGGREGATION +parallelism&high availability&依赖 +parallelism&high availability&依赖 +parallelism&probability&依赖 +parallelism&high availability&依赖 +parallelism&probability&依赖 +rack name&worker node&AGGREGATION +rack name&network switch&AGGREGATION +rack name&[ 3 ]&依赖 +information&Hadoop application&依赖 +information&command&依赖 +HDFS filesystem&datum&依赖 +they&information&依赖 +HDFS filesystem&filesystem&GENERALIZATION +case&rack power or switch failure&AGGREGATION +hdf&reliable and extremely fast computations [ 5 ]&依赖 +hdf&numerous data blocks replica&依赖 +hdf&a cluster&依赖 +hdf&communication and client&依赖 +communication and client&RPC&依赖 +hdf&TCP/IP layer&依赖 +hdf&64 mb )&依赖 +ideal file size&64 mb )&依赖 +multiple&64 mb )&AGGREGATION +hdf&multiple&依赖 +hdf&large file&依赖 +datum&three node&依赖 +datum&default replication value&依赖 +replication&[&AGGREGATION +Data node&datum&依赖 +Figure 1&hdf&依赖 +client&single NameNode machine&依赖 +client&file metada or file modification&依赖 +NameNode and Datanodes&built-in webservers [ 6 ]&依赖 +current status&cluster&AGGREGATION +their&]& +NameNode&HDFS metadata [ 7 ]&依赖 +system&flows&依赖 +system&such a way&依赖 +user datum&NameNode [ 7 ]&依赖 +hdfs architecture&work&依赖 +[ 7 ] NameNode&Datanode&依赖 +[ 7 ] NameNode&periodical heartbeat message&依赖 +case&network partition&AGGREGATION +subset&Datanodes&AGGREGATION +datanode&recent heartbeat&依赖 +Datanode death&block&依赖 +Datanode death&replication factor&依赖 +replication factor&block&AGGREGATION +their&value& +NameNode&which&依赖 +replication factor&file&AGGREGATION +hdf&HDFS namespace&依赖 +set&Datanodes&AGGREGATION +file&one or more block&依赖 +block&set&依赖 +block&Datanodes&依赖 +reference&block&AGGREGATION +NameNode&block&依赖 +NameNode&reference&依赖 +NameNode&reference&依赖 +NameNode&block&依赖 +NameNode&HDFS namespace operation&依赖 +NameNode&block&依赖 +mapping&block&AGGREGATION +NameNode&mapping&依赖 +NameNode&mapping&依赖 +NameNode&block&依赖 +system&clients& +Datanodes&block creation&依赖 +NameNode&HDFS namespace&依赖 +NameNode&Edit Log&依赖 +modification&place&依赖 +modification&file system metada&依赖 +transaction log&log&GENERALIZATION +NameNode&transaction log&依赖 +NameNode&file&依赖 +NameNode&local host OS file system&依赖 +its&system& +entire file system namespace&file&依赖 +NameNode&system& +Silage&’s local file system&依赖 +Silage&[ 7 ]&依赖 +Silage&file&依赖 +NameNode&memory& +image&entire file system namespace and file Block map&AGGREGATION +image&’s system memory ( ram )&依赖 +large number&files and directory&AGGREGATION +4GB&RAM&AGGREGATION +it&silage and edit log&依赖 +it&disk&依赖 +in-memory representation&Silage&AGGREGATION +It&old EditLog&依赖 +transaction&persistent FsImage&依赖 +its&transactions& +procedure&checkpoint&依赖 +NameNode&up [ 7 ]&依赖 +checkpoint¤t implementation&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&file&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&datanode store hdfs datum&依赖 +datanode store hdfs datum&local file system&依赖 +datanode store hdfs datum&file&依赖 +Datanode&knowledge&依赖 +Datanode&HDFS file&依赖 +It&HDFS datum&依赖 +It&block&依赖 +It&HDFS datum&依赖 +block&HDFS datum&AGGREGATION +It&block&依赖 +It&block&依赖 +It&HDFS datum&依赖 +Datanode&file&依赖 +Datanode&same directory&依赖 +optimal number&file&AGGREGATION +it&heuristic&依赖 +It&local file&依赖 +local file system&single directory&依赖 +local file system&huge number&依赖 +huge number&file&AGGREGATION +It&same directory&依赖 +list&HDFS data block&AGGREGATION +it&local file system&依赖 +NameNode&file&依赖 +NameNode&client request&依赖 +HDFS client&file datum&依赖 +HDFS client&temporary local file&依赖 +HDFS client&reality&依赖 +HDFS client&client&GENERALIZATION +Application write&temporary local file&依赖 +client contact&NameNode&依赖 +local file&datum worth&依赖 +local file&one HDFS block size&依赖 +client contact&NameNode&依赖 +client contact&NameNode&依赖 +namenode insert&file name&依赖 +namenode insert&file system hierarchy&依赖 +namenode insert&file name&依赖 +namenode insert&file system hierarchy&依赖 +NameNode&Datanode&依赖 +NameNode&identity&依赖 +identity&Datanode&AGGREGATION +NameNode&client request&依赖 +client&datum&依赖 +client&block&依赖 +client&datum&依赖 +block&datum&AGGREGATION +client&datum&依赖 +client&block&依赖 +client&block&依赖 +un-flushed datum&Datanode&依赖 +client&NameNode&依赖 +NameNode&persistent store&依赖 +NameNode&point&依赖 +NameNode&file creation operation&依赖 +its&store& +PROBLEM STATEMENT AND MOTIVATION&architecture&实现 +PROBLEM STATEMENT AND MOTIVATION&Hadoop [ 7 ]&实现 +PROBLEM STATEMENT AND MOTIVATION&Hadoop [ 7 ]&实现 +architecture&Hadoop [ 7 ]&AGGREGATION +PROBLEM STATEMENT AND MOTIVATION&Hadoop [ 7 ]&实现 +PROBLEM STATEMENT AND MOTIVATION&architecture&实现 +PROBLEM STATEMENT AND MOTIVATION&architecture&实现 +PROBLEM STATEMENT AND MOTIVATION&Hadoop [ 7 ]&实现 +usage&single NameNode machine&AGGREGATION +PROBLEM STATEMENT AND MOTIVATION&architecture&实现 +simplicity&cost , namely scalability and high availability issue&依赖 +maximum number&Datanodes&AGGREGATION +hdf&one distinctive manager/controller server machine&依赖 +server machine&machine&GENERALIZATION +hdf&NameNode&依赖 +it&outstanding client request&依赖 +Datanode&operation&依赖 +NameNode server restoration process&hour&依赖 +hdf&Secondary Namenode&依赖 +NameNode&information& +directory information&information&GENERALIZATION +Secondary NameNode function&directory information&依赖 +periodic image-based snapshot&directory information&AGGREGATION +Secondary NameNode function&periodic image-based snapshot&依赖 +edit log&an up-to-date directory structure [ 3 ]&依赖 +entire journal&HDFS action&AGGREGATION +above-mentioned issue&make&依赖 +above-mentioned issue&us&依赖 +above-mentioned issue&us&依赖 +above-mentioned issue&a way&依赖 +above-mentioned issue&a way&依赖 +above-mentioned issue&make&依赖 +paper&problem&依赖 +paper&solution&依赖 +it&node [ 9 ]&依赖 +it&key&依赖 +it&unique key&依赖 +v. chord protocol functional&chord protocol&AGGREGATION +Chord&[ 10 ]&依赖 +node&equal number&依赖 +consistent hash&load balancing&依赖 +node&key&依赖 +less reallocation&key&AGGREGATION +node&system [ 9 ]&依赖 +equal number&key&AGGREGATION +chord protocol address&fundamental issue&依赖 +node&a cluster include load balancing&依赖 +chord protocol address&fundamental issue&依赖 +It&load balancing&依赖 +hash function&function&GENERALIZATION +large cluster&node&AGGREGATION +chord lookup cost increase&log&依赖 +log&number&AGGREGATION +chord lookup cost increase&node&依赖 +chord lookup cost increase&log&依赖 +chord lookup cost increase&number&依赖 +chord lookup cost increase&node&依赖 +number&node&AGGREGATION +chord lookup cost increase&log&依赖 +chord lookup cost increase&number&依赖 +chord lookup cost increase&node&依赖 +chord lookup cost increase&node&依赖 +chord lookup cost increase&chord lookup cost increase&依赖 +chord lookup cost increase&number&依赖 +chord lookup cost increase&number&依赖 +chord lookup cost increase&log&依赖 +chord lookup cost increase&chord lookup cost increase&依赖 +chord lookup cost increase&chord lookup cost increase&依赖 +chord lookup cost increase&chord lookup cost increase&依赖 +additional parameter tuning&scaling&依赖 +its&tables& +Chord&high availability&依赖 +fault tolerant cluster&node&AGGREGATION +system&change [ 9 ]&依赖 +continuous state&change [ 9 ]&AGGREGATION +application&it&依赖 +fail safe nature&Chord software&AGGREGATION +form&library&AGGREGATION +fail safe nature&form&依赖 +fail safe nature&library&依赖 +system&Chord&依赖 +system&two fold&依赖 +system&two fold&依赖 +system&Chord&依赖 +function&node&依赖 +application&Chord library&依赖 +function&IP address&依赖 +application&function&依赖 +IP address&node&AGGREGATION +Chord library&library&GENERALIZATION +set&key&AGGREGATION +application&node&依赖 +application&Chord software&依赖 +new node&cluster [ 9 ]&依赖 +update&application software&依赖 +their&nodes& +update&respective value&依赖 +user-friendly naming&datum&AGGREGATION +requirements implementation&implementation&GENERALIZATION +flat key-space feature&Chord&AGGREGATION +flat key-space feature&requirements implementation&实现 +cryptographic hash&datum&AGGREGATION +application&datum&依赖 +application&Chord key&依赖 +Chord key&key&GENERALIZATION +application&data replication&依赖 +data&identifier& +several content provider&other ’s datum&依赖 +set&software development project&AGGREGATION +node&software development project&依赖 +everyone&periodic release&依赖 +node&load& +aggregate cost&cluster&AGGREGATION +implementation&Chord&依赖 +implementation&map data block&依赖 +Dabek et al. [ 12 ]&implementation&依赖 +Dabek et al. [ 12 ]&concept&实现 +implementation&concept&AGGREGATION +implementation&map data block&依赖 +implementation&Chord&依赖 +Chord&load balance&依赖 +Chord&application&依赖 +their&data& +they&return&依赖 +they&having&依赖 +node&’s datum&依赖 +node&data& +data&name& +Several similar problem&cooperative mirroring application&依赖 +goal&high availability&依赖 +Our&aim& +Our&architecture& +proposed architecture&NameNode Clustered chord ( nucu )&依赖 +client&single NameNode machine&依赖 +client&single NameNode machine&依赖 +client&file metadata or file modification&依赖 +client&file metadata or file modification&依赖 +client&single NameNode machine&依赖 +client&file metadata or file modification&依赖 +client&file metadata or file modification&依赖 +client&single NameNode machine&依赖 +We&client request&依赖 +We&resource request&依赖 +resource request&key&依赖 +resource request&consistent hashing algorithm&依赖 +NameNode&resource request reply ( rrp )&依赖 +NameNode&client resource request&依赖 +client resource request&resource request&GENERALIZATION +RRQ&NCUC black-box&依赖 +client&respective Datanodes&依赖 +client&respective Datanodes&依赖 +workflow&Figure 2&依赖 +NCUC&NCUC NameNodes&依赖 +NCUC&following way&依赖 +NCUC&key&依赖 +identifier&NCUC identifier NameNode ring modulo 2k&依赖 +whose&identifier& +identifier&z&AGGREGATION +NCUC&a k-bit identifier use sha-1 [ 16 ]&依赖 +NCUC&NameNode&依赖 +NCUC&consistent hash function&依赖 +its&key& +NameNode&identifier& +NameNode&address& +NameNode&successor NameNode&依赖 +successor NameNode&key z , or succ ( z )&AGGREGATION +successor NameNode&NameNode&GENERALIZATION +NCUC black-box&five key&依赖 +NameNode&key z , or succ ( z )&依赖 +NCUC black-box&ten NameNodes&依赖 +circle&number&AGGREGATION +Figure3&NCUC ring&依赖 +NCUC ring&ten NameNodes&依赖 +NCUC ring&ten NameNodes&依赖 +so key 10&NameNode 14&依赖 +successor&identifier 10 , succ ( 10 )&AGGREGATION +key 24&NameNode 32&依赖 +namenodes join&NCUC cluster&依赖 +namenodes join&NCUC cluster&依赖 +namenodes join&little interruption&依赖 +namenodes join&little interruption&依赖 +NCUC cluster&cluster&GENERALIZATION +n&successor& +NameNode n&NCUC clustered ring&依赖 +n&departure& +n&keys& +further change&keys allocation&依赖 +further change&NCUC namenode&依赖 +it&identifier 24&依赖 +it&key&依赖 +it&identifier 32&依赖 +it&key&依赖 +it&NameNode&依赖 +quick distributed calculation&hash function&AGGREGATION +NCUC&quick distributed calculation&依赖 +NCUC&hash function&依赖 +NCUC map&consistent hash [ 14 , 15 ]&依赖 +Nth NameNode&NCUC cluster&依赖 +NCUC hash function&hash function&GENERALIZATION +Nth NameNode&NameNode&GENERALIZATION +NCUC hash function&load balancing&依赖 +NameNodes approximately equal number&key&AGGREGATION +merely o ( 1/n ) portion&key&AGGREGATION +NameNode&table&依赖 +Workflow&ncuc architecture begin client resource requests – hash&AGGREGATION +NameNode&o ( logn&依赖 +lookup&) message&依赖 +lookup&o ( log n&依赖 +usage&Chord protocol [ 9 ]&AGGREGATION +one&primary goal&AGGREGATION +It&single HDFS NameNode architecture&实现 +simplicity&single HDFS NameNode architecture&AGGREGATION +It&simplicity&依赖 +primary goal&simple HDFS architecture&AGGREGATION +its&limitation& +single point-of-failure HDFS NameNode&alternative solution&依赖 +our&implementation& +we&performance analysis first&依赖 +we&Chord&依赖 +we&set&依赖 +we&experiment&依赖 +our&architecture& +set&experiment&AGGREGATION +we&2 Linux Amazon Cloud EC2 node&依赖 +We¤t HDFS architecture&依赖 +Table 1¤t HDFS architecture&依赖 +size 512 MB&512 MB&GENERALIZATION +Table 1&result&依赖 +single file&size 512 MB&AGGREGATION +Table 1&single file&依赖 +Table 2&size 512 MB&依赖 +Table 2&size 512 MB&依赖 +Table 2&result&依赖 +Table 2&result&依赖 +Table 2&single file&依赖 +Table 2&single file&依赖 +512 MB&nrfile = 5 , replication = 1 op&依赖 +512 MB&nrfile = 5 , replication = 1 op&依赖 +I/O rate ( mb/s&0 0 0 0&依赖 +term&I/O rate&AGGREGATION +term&throughput&AGGREGATION +I/O rate ( mb/s&0 0 0 0&依赖 +IaaS , PaaS and saa&cost&依赖 +Hadoop application&data storage&依赖 +Hadoop application&primary distributed file system&依赖 +whose&NameNode& +proposed architecture&single-point-of-failure&依赖 +availability and scalability&HDFS architecture&AGGREGATION +its&single-point-of-failure& +proposed architecture&availability and scalability&依赖 +proposed architecture&HDFS architecture&依赖 +little complexity&approach&依赖 +little complexity&HDFS NameNode&依赖 +we&extensive experiment&依赖 +result&future extensive evaluation process&AGGREGATION +our&process& +acknowledgment author&support&依赖 +King Fahd University KFUPM&Petroleum and Minerals&AGGREGATION +project&number&GENERALIZATION +project&King Abdulaziz City kacst )&依赖 +project&Technology&依赖 +Berkeley View&Cloud Computing&AGGREGATION +technical report eecs-2009-28 and http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.html and Feb.&technical report eecs-2009-28 and http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.html and Feb.&依赖 +Theory&Computing&AGGREGATION +― Serving dn&Chord&依赖 +[ 12 ] F. Dabek&Proc&依赖 +― Analysis&evolution&AGGREGATION +evolution&peer-to-peer system&AGGREGATION +13 ] D. Liben-Nowell&Proc&依赖 +principle distribute computing ( podc ) and CA , July 2002 , pp.&distribute computing ( podc )&AGGREGATION +protocol&Proc&依赖 +protocol&Proc&依赖 +protocol&Proc&依赖 +Master&thesis& +Department&Electric&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt b/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt new file mode 100644 index 0000000..22c0712 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt @@ -0,0 +1,205 @@ +Towards A Scalable HDFS Architecture +Farag Azzedin +Information and Computer Science Department +King Fahd University of Petroleum and Minerals +Dhahran, 31261, Saudi Arabia +fazzedin@kfupm.edu.sa +Abstract—Cloud computing infrastructures allow corporations to reduce costs by outsourcing computations on-demand. One of the areas cloud computing is increasingly being utilized for is large scale data processing. Apache Hadoop is one of these large scale data processing projects that supports data-intensive distributed applications. Hadoop applications utilize a distributed file system for data storage called Hadoop Distributed File System (HDFS). HDFS architecture, by design, has only a single master node called NameNode, which manages and maintains the metadata of storage nodes, called Datanodes, in its RAM. Hence, HDFS Datanodes’ metadata is restricted by the capacity of the RAM of the HDFS’s single-point-of-failure NameNode. This paper proposes a fault tolerant, highly available and widely scalable HDFS architecture. The proposed architecture provides a distributed NameNode space eliminating the drawbacks of the current HDFS architecture. This is achieved by integrating the Chord protocol into the HDFS architecture. +Keywords-Cloud Computing Platform, Hadoop, HDFS, Chord, Distributed NameNode +I. INTRODUCTION AND RELATED WORK +Cloud computing environments can provide large-scale datacenters at reduced cost by using or integrating the service models namely software as a service (SaaS), platform as a service (PaaS) and infrastructure as a service (IaaS). This results in the increased income for cloud computing service providers and decrease costs for cloud users [1, 2]. This motivated researchers to introduce systems such as Google's MapReduce, Google File System (GFS) and Hadoop [3]. The Apache Hadoop is one of the cloud computing projects; built using Java aiming to develop open-source software for reliable and scalable data intensive distributed computing [2, 3, 4]. Yahoo!, which uses Hadoop in its applications [3], has been the major contributor to this project. +Hadoop applications utilize a distributed file system for data storage called Hadoop Distributed File System (HDFS). HDFS implementation may contain hundreds or even thousands of server machines, each storing some part of the file system’s data. This opens the door for more hardware failures because more server machines mean more hardware and thus high probability of hardware failures. This makes it inevitable that some component of HDFS is always non-functional. Thus, faults detection, alarms, and automatic prompt server recovery are fundamental architectural goals of HDFS [3, 7]. The same applies for a NameNode server in an HDFS cluster. HDFS’s performance heavily relies on the availability of single NameNode machine. Currently, automatic restart and failover of the NameNode software to another machine is not supported [3, 7]. +Hadoop applications utilize HDFS [7], which has only a single master node called NameNode, which manages and maintains the metadata of storage nodes, called Datanodes, in its RAM [7]. Hence, HDFS Datanodes’ metadata is restricted by the capacity of the RAM of the HDFS’s single-point-of-failure NameNode. This paper proposes a fault tolerant, highly available and widely scalable HDFS architecture having a NameNode which is distributed and will not suffer HDFS failure in case of a single NameNode failure. This is achieved by using Chord protocol to introduce clustering in HDFS NameNode. +Several research projects have used Chord as a basis for their research. In a peer-to-peer system, the Chord File System (CFS) stores files and metadata and uses Chord to locate storage blocks [12]. Several investigation methods have proved that Chord’s stabilization algorithms with fewer changes provide decent lookup performance, regardless of constant failure and joining of nodes [13, 17]. DNS provides a lookup service, with host names as keys and IP addresses (and other host information) as values [9]. Chord could provide the same service by hashing each host name to a key [11]. Chord-based DNS would require no special servers, while ordinary DNS relies on a set of special root servers. DNS requires manual management of the routing information (NS records) that allows clients to navigate the name server hierarchy; Chord automatically maintains the correctness of the analogous routing information [9]. DNS only works well when host names are structured to reflect administrative boundaries; Chord imposes no naming structure [9]. DNS is specialized to the task of finding named hosts or services, while Chord can also be used to find data objects that are not tied to particular machines [9]. +The rest of the paper is organized as follows. Hadoop architecture is briefly introduced in Section II. This is followed by Section III explaining how Hadoop and HDFS work. Next, we discuss the issues in current Hadoop architecture with respect to its NameNode, while Section IV outlines the problem statement and our motivation to propose a modification to the existing HDFS architecture. We also 978-1-4673-6404-1/13/$31.00 ©2013 IEEE 155 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. +discuss the Chord architecture in Sections V. Section VI presents the proposed HDFS NameNode solution and architecture. We conclude and specify areas of future work in Section VII. +II. EXISTING HADOOP ARCHITECTURE +Hadoop includes several sub-projects namely Hadoop Common HDFS, and MapReduce besides several others [4]. This section briefly discusses the sub-projects of Hadoop namely Hadoop Common, HDFS and MapReduce. +Hadoop Common: Hadoop Common provides the common utilities to support the other Hadoop subprojects and enables entry point to the Hadoop filesystems [3, 4]. Hadoop Common contains Filesystem, RPC, serialization libraries, some required jar files and scripts to initiate Hadoop [3]. Also, Hadoop Common provides source code, documents, and a contribution area that contains other Hadoop community projects [3]. +HDFS: Although Hadoop supports other storage filesystems to store datasets including Amazon S3 filesystem, CloudStore (a.k.a. Kosmos Distributed File System), FTP filesystem, and Read-only HTTP and HTTPS filesystems [3], HDFS is its primary storage and rack-aware filesystem, that is used by its applications [3, 4]. HDFS is designed to work with large data sets requiring tens of petabytes of storage. HDFS operates on top of the filesystems of the underlying OS [3]. HDFS is written in Java language [3]. HDFS is highly fault-tolerant and is designed to be deployed on low-cost hardware [7]. +HDFS has master/slave architecture. A typical Hadoop cluster is mainly comprised of a NameNode and several Datanode machines. The NameNode manages the HDFS namespace and regulates access to files that are requested by clients [7]. Datanodes, which manage storage attached to the nodes that they run on, store the actual data [6, 7]. +The NameNode and Datanode are software programs designed to run on everyday use machines. These machines typically run on a GNU/Linux OS. HDFS can be run on any machine that supports Java and therefore can run either a NameNode or the Datanode software. Usage of the highly portable and all pervasive Java language means that HDFS can be deployed on a wide range of machines. A typical deployment has a dedicated machine that runs only the NameNode software. Each of the other machines in the cluster runs one instance of the Datanode software. The architecture does not prevent running multiple Datanodes on the same machine but, in practice, that is rarely the case [7]. +MapReduce: For huge data sets of distributed applications, MapReduce is well known for its simplicity and functionality [7]. It serves as an integral part of Hadoop to support distributed computing on large data sets on clusters of computers [8]. MapReduce can be applied on the data stored in either a filesystem (unstructured) or within a database (structured) [8]. During a typical ―Map‖ function, the master node accepts a major input, slices it into several minor sub-problems, and allocates them to worker nodes [8]. A worker node could repeat this process again, if needed, resulting in a multi-level tree structure [8]. Finally, the worker node processes the received problem chunk, and returns the processed data back to its master node [8]. In the "Reduce" function, the master node receives the processed sub-problems and aggregates them in some way to form the output [8]. +MapReduce has been wisely chosen to be the part of Hadoop project because it enables unnoticed distributed processing of the map and reduction operations. Hence, multiple map functions can be run in parallel, given that, each mapping operation is autonomous of the other. In reality, however, this condition is limited by the data source and/or the number of CPUs near that data. Likewise, a set of 'reducers' can be run all at the same time during the reduction phase, given that all outputs of the map operation, which share the same key, are presented to the same reducer simultaneously. Although, this procedure may look ineffective compared to other sequential algorithms, MapReduce can be functional to potentially larger datasets than "commodity" servers can handle. Hence, for instance, using MapReduce, a large server cluster can sort a petabyte of data in only a few hours. Moreover, this parallelism also enables a probability of high availability in case of a partial failure of servers or storage during the operation. That is, if one mapper or reducer fails, the work can be rescheduled, given that the input data is still available [8]. +III. HOW HADOOP AND HDFS WORK? +For productive work scheduling, usually the filesystems provide location-awareness i.e., rack name of a worker node, for instance, the rack name of the network switch [3]. This information helps Hadoop applications to execute commands on the corresponding compute nodes [3]. When the HDFS filesystem starts replicating data, they use this information to keep multiple data copies on redundant racks [3]. The overall objective here is to provide high data availability in case of rack power or switch failure [3]. HDFS generates numerous data blocks replicas and distributes them on Datanodes, throughout a cluster to accomplish reliable and extremely fast computations [5]. HDFS provides high throughput access to application data [7]. +HDFS uses the TCP/IP layer for communication and clients use RPC to communicate with each other. The HDFS can store large files (an ideal file size is a multiple of 64 MB), across multiple Datanode machines. HDFS accomplishes reliability by duplicating the data across multiple hosts, and hence does not require RAID storage on hosts. With the default replication value, 3, data is stored on three nodes: two on the same rack, and one on a different rack. Data nodes can talk to each other to rebalance data, to move copies around, and to keep the replication of data high [3]. +156 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. +Figure 1 shows how Hadoop uses HDFS to function. Clients contact the single NameNode machine for file metadata or file modifications and perform actual file I/O directly with the Datanodes [6]. To easily find out the current status of a cluster, the NameNode and Datanodes use their built-in webservers [6]. The NameNode is the judge and source for all HDFS metadata [7]. The system is designed in such a way that user data never flows through the NameNode [7]. +Figure 1: How HDFS Architecture works? [7] +NameNode receives a periodical heartbeat message from each Datanode. The NameNode may get disconnected with a subset of Datanodes in case of a network partition. The NameNode declares dead to those Datanodes that do not send recent heartbeats and stops forwarding any new I/O requests to them. Data that was registered to those dead Datanodes becomes unavailable to HDFS as well. Datanode death may cause the replication factor of some blocks to fall below their specified value. The NameNode constantly tracks which blocks need to be replicated and initiates replication, whenever necessary. The requirement for re-replication may occur because of several reasons: a Datanode may become unavailable, a replica may become corrupted, a hard disk on a Datanode may fail, or the replication factor of a file may be increased [7]. +HDFS represents an HDFS namespace and enables user data to be stored in block-based file chunks over Datanodes. Specifically, a file is split into one or more blocks and these blocks are stored in a set of Datanodes. The NameNode also keeps reference of these blocks in a block pool. The NameNode executes HDFS namespace operations like opening, closing, and renaming files and directories. The NameNode also maintains and find outs the mapping of blocks to Datanodes. The Datanodes are accountable for performing read and write requests from the file system’s clients. The Datanodes also perform block creation, deletion, and replication upon receiving the instructions from the NameNode [7]. +The NameNode stores the HDFS namespace. The NameNode keeps a transaction log called the Edit Log to continuously record every modification that takes place in the file system metadata. For instance, creating a new file in HDFS causes an event that asks the NameNode to insert a record into the Edit Log representing this action. Likewise, changing the replication factor of a file causes another event that asks the NameNode to insert another new record to be inserted into the Edit Log representing this action. The NameNode uses a file in its local host OS file system to store the Edit Log. The entire file system namespace, including the mapping of blocks to files and file system properties, is stored in a file called the Silage. The Silage is stored as a file in the NameNode’s local file system too [7]. +The image of the entire file system namespace and file Block map is kept in the NameNode’s system memory (RAM). This key metadata item is designed to be compact, such that a NameNode with 4GB of RAM is plenty to support a large number of files and directories. When the NameNode starts up, it reads the Silage and Edit Log from disk, applies all the transactions from the Edit Log to the in-memory representation of the Silage, and flushes out this new version into a new Silage on disk. It can then truncate the old EditLog because its transactions have been applied to the persistent FsImage. This procedure is known as a checkpoint. In the current implementation, a checkpoint only occurs when the NameNode starts up [7]. +The Datanode stores HDFS data in files in its local file system. The Datanode has no knowledge about HDFS files. It stores each block of HDFS data in a separate file in its local file system. The Datanode does not create all files in the same directory. Instead, it uses heuristics to determine the optimal number of files per directory and creates subdirectories appropriately. It is not optimal to create all local files in the same directory because the local file system might not be able to efficiently support a huge number of files in a single directory. When a Datanode starts up, it scans through its local file system, generates a list of all HDFS data blocks that correspond to each of these local files and sends this report to the NameNode: this is the Blockreport [7]. +The NameNode does not receive the client request to create a file. In reality, the HDFS client, initially, caches the file data into a temporary local file. Application writes are transparently redirected to this temporary local file. When the local file accumulates data worth over one HDFS block size, the client contacts the NameNode. The NameNode inserts the file name into the file system hierarchy and allocates a data block for it. The NameNode responds to the client request with the identity of the Datanode and the destination data block. Then the client flushes the block of data from the local temporary file to the specified Datanode. When a file is closed, the remaining un-flushed data in the temporary local file is transferred to the Datanode. The client then informs the NameNode that the file is closed. At this point, the NameNode commits the file creation operation into its persistent store. If the NameNode dies before the file is closed, the file is lost [7]. +157 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. +IV. PROBLEM STATEMENT AND MOTIVATION +The usage of a single NameNode machine in a cluster greatly simplifies the architecture of Hadoop [7]. However, this simplicity comes at some cost, namely scalability and high availability issues. +Scalability Issue: An HDFS NameNode server RAM size limits the metadata and thus the maximum number of Datanodes, and/or relative transactional metadata, that are supported in an HDFS cluster [7]. +High Availability Issue: An HDFS needs one distinctive manager/controller server machine, the NameNode. This is a single point-of-failure for an HDFS implementation. Once this NameNode fails, the HDFS goes offline. After it gets back online, it must respond to all outstanding client requests and Datanode manage operations. The NameNode server restoration process can take over half an hour for a large cluster. The HDFS also includes a Secondary Namenode, which could be misleading to some people that after the Primary NameNode server fails, the Secondary NameNode gets active and takes over. In reality, the Secondary NameNode function is just there to build periodic image-based snapshots of the Primary NameNode's directory information and save them to local/remote directories. These image-based checkpoints can only be used to restart a failed Primary NameNode without having to replay the entire journal of HDFS actions, the edit log to create an up-to-date directory structure [3]. +The above-mentioned issues in HDFS NameNode architecture motivated us to find a way to make the NameNode seamlessly highly available, scalable and thus improving HDFS performance. Chord protocol and its applications can provide a reliable and efficient solution to these problems. This paper proposes a solution to these problems by modifying the existing HDFS NameNode architecture. +V. CHORD PROTOCOL +The functional of Chord protocol is primitive: for a unique key, it maps this key to a node [9]. This node, depending on the application using Chord, could be in charge for storing a corresponding value for its key [9]. Chord employs consistent hashing [10] to allocate keys to Chord nodes [9]. Because each node receives approximately the equal number of keys, consistent hashing performs load balancing and needs comparatively less reallocation of keys when nodes join and leave the system [9]. +Chord protocol addresses the fundamental issues authoritatively when a node joins or leaves a cluster including load balancing, scalability, and availability. It achieves load balancing by acting as a distributed hash function and assigning keys uniformly over the nodes. Chord is highly scalable and can work for very large cluster of nodes. Hence, Chord lookup cost increases with the log of the number of nodes. Additionally, no additional parameter tuning is necessary to accomplish this scaling. Chord achieves high availability by automatically adjusting its internal tables as the new nodes join and leave (due to failure, and/or maintenance etc.) the cluster. This ensures a highly fault tolerant cluster of nodes. Hence, the node responsible for a key can always be found irrespective of nodes joining or leaving a cluster or even if the system is in continuous state of change [9]. +The fail safe nature of Chord software takes the form of a library to be connected with the applications using it. The system containing the application interacts with the Chord in two folds. Initially, the application receives a function from the Chord library that contains the IP address of the node responsible for the key. Lastly, the application with modifications in the sets of keys for each responsible nodes gets notified from the Chord software on each node. For instance, this update enables the application software to shift the respective values to their new location nodes, when a new node joins or leaves the cluster [9]. +The required authentication, caching, duplication, and user-friendly naming of data are provided by the application using Chord. The flat key-space feature of the Chord simplifies these requirements implementation. For instance, for data authentication, an application may store the data using a Chord key that is derived using a cryptographic hash of this data. Likewise, the application may also achieve data replication by storing it using two separate Chord keys resulting from the data’s application-level identifier. Other instances where Chord can provide a good basis include Cooperative Mirroring, and Time-Shared Storage [9]. +During Cooperative Mirroring, several content providers work together to store and serve each other’s data. These nodes could be a set of software development projects, everyone making a periodic release. Distributing the accumulative work load uniformly over all nodes reduces the aggregate cost of the cluster, because every node will be required to deliver the capacity for the average load only and not the node’s highest load. Dabek et al. [12] explains an implementation of this concept that uses Chord to map data blocks onto servers. Chord interacts with the application to load balance, replicate data, and latency-based server selection [9]. +In Time-Shared Storage, the nodes, to achieve high availability, but have sporadic connectivity may offer to store other node’s data while they are connected, in return for having their data stored elsewhere when they are disconnected. To detect the Chord node which is alive and is acting as the data store at some point in time, the data’s name can be used as a key for it. Several similar problems occur just as in the cooperative mirroring application; however the goal here is to achieve high availability rather than load balancing [9]. +VI. PROPOSED ARCHITECTURE +Our aim is to enhance the HDFS architecture so that HDFS NameNode is highly available and scalable. This is 158 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. +accomplished by integrating the Chord protocol into the existing HDFS NameNode architecture. Our proposed architecture is referred to as NameNode Clustered Using Chord (NUCU). +A. NCUC Architecture +With single HDFS NameNode in the existing architecture, clients request the single NameNode machine for file metadata or file modifications and perform the actual file I/O directly with the Datanodes [6]. We will refer to these client requests as resource requests. Each resource request will be hashed into a key using a consistent hashing algorithm to form a resource request query (RRQ). The NameNode responds to a client resource request with resource request reply (RRP). +NCUC architecture is simple. The RRQ will be passed to NCUC black-box, which would provide the client with the RRP. The clients, upon receiving the RRP, would contact the respective Datanodes, specified in RRP, to perform the desired I/O requests for the data chunks stored in Datanodes. This workflow is explained in Figure 2. NCUC, using consistent hashing, maps the keys to NCUC NameNodes in the following way. Identifiers are assigned on an NCUC identifier NameNode ring modulo 2k. The first node, whose identifier is equal to or tails the identifier of z in the identifier space, is mapped a key z. +B. Inside the NCUC Black-box: +The NCUC uses consistent hash function to map each NameNode and its key with a k-bit identifier using SHA-1 [16] as a base hash function. A NameNode’s identifier is selected by hashing the NameNode’s static IP address, whereas a key identifier is constructed by hashing the key. It should be noted that the identifier length k should be sufficiently large to avoid the probability of having one NameNode or key hashing to the other already assigned key or NameNode identifier. +Figure 3: NCUC black-box containing ten NameNodes storing five keys +This NameNode is referred as the successor NameNode of key z, or succ(z). Assuming that the identifiers are indicated as a circle of numbers from 0 to 2m — 1, then the succ(z) will be the first NameNode clockwise from z. This can be comprehended using the following example. Figure3, shows a NCUC ring with k = 6. The NCUC ring, storing five keys, has ten NameNodes. Here, the successor of identifier 10, succ(10), is NameNode 14, so key 10 would be located at NameNode 14. Likewise, keys 24 and 30 would be located at NameNode 32, key 38 at NameNode 38, and key 54 located at NameNode 56. +NCUC using consistent hashing is intended to enable NameNodes join and exit the NCUC cluster with little interruption. Some keys formerly allocated to n’s successor now would be reassigned to n in order to preserve the NCUC consistent hashing mapping when a NameNode n enters the NCUC clustered ring. All of NameNode n’s allocated keys will be reallocated to n’s successor upon n’s departure from the NCUC clustered ring. No further changes are required in the keys allocation to NCUC NameNodes. In Figure 3, considering that a NameNode were to enter the NCUC ring with identifier 26, it would get the key with identifier 24 from the NameNode with identifier 32. +NCUC offers quick distributed calculation of a hash function, assigning keys to NameNodes. NCUC maps keys to NameNodes using consistent hashing [14, 15]. The NCUC hash function, quite efficiently, does load balancing by allocating all NameNodes approximately equal number of keys and after an Nth NameNode enters or departs the NCUC cluster, merely O(1/N) portion of the keys are forwarded to the next relevant NameNode. +For a NCUC cluster with N NameNodes, each NameNode will preserve routing table merely regarding O(logN) other +Figure 2: Workflow of NCUC Architecture +BEGIN +CLIENT RESOURCE REQUESTS – HASH INTO RRQ +NCUC Black-box +NCUC RESPONSE – RRP – CLIENT ACKNOWLEDGES +CLIENT CONTACTS DATANODES +END +N51 +N56 +N1 +N8 +N14 +N21 +N32 +N38 +N42 +N48 +Z10 +Z34 +Z24 +Z38 +Z54 159 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. +NameNodes, while the lookup will need O(log N) messages. This is achieved due to the usage of the Chord protocol [9]. +It is arguable that Chord integration into HDFS NameNode architecture impacts the simplicity of a single HDFS NameNode architecture, which is one of the primary goals of a simple HDFS architecture. However, the single point-of-failure HDFS NameNode and its RAM limitation to keep all the files metadata, stored in the Datanodes, required an alternative solution. Chord integration into HDFS NameNode provides a reliable and efficient solution to this problem. +VII. PERFORMANCE ANALYSIS +First, we developed Chord and validated our Chord implementation by reproducing all the experiments’ results conducted in [9]. Second, we performed a set of experiments to evaluate our proposed HDFS architecture. In evaluating our proposed HDFS architecture, we used 2 Linux Amazon Cloud EC2 nodes after installing Hadoop on these machines. We then configured and tested the current HDFS architecture as well as our proposed HDSF architecture by performing two operations, namely READ and WRITE. +Table 1 shows the results of writing and reading a single file of size 512 MB using the current HDFS architecture. On the other hand, Table 2 shows the results of writing and reading a single file of size 512 MB using our proposed HDFS architecture. +TABLE I. W/R RESULTS USING CURRENT HDFS ARCHITECTURE. 512 MB, Blocksize=64 MB, nrFiles=5, Replication=1 +Op. +Performance +Metrics +Exp.#1 +Exp. +#2 +Exp. +#3 +Ave. +W +Throughput (mb/s) +129 +134 +139 +134 +Ave. I/O rate (mb/s) +129 +134 +139 +134 +I/O rate std deviation +0 +0 +0 +0 +R +Throughput (mb/s) +150 +146 +152 +150 +Ave. I/O rate (mb/s) +151 +147 +153 +150 +I/O rate std deviation +13 +5 +13 +10 +TABLE II. W/R RESULTS USING PROPOSED HDFS ARCHITECTURE. +512 MB, Blocksize=64 MB, nrFiles=5, Replication=1 +Op. +Performance +Metrics +Exp.#1 +Exp. +#2 +Exp. +#3 +Ave. +W +Throughput (mb/s) +156 +151 +154 +154 +Ave. I/O rate (mb/s) +152 +149 +150 +150 +I/O rate std deviation +0 +0 +0 +0 +R +Throughput (mb/s) +180 +180 +174 +178 +Ave. I/O rate (mb/s) +176 +176 +176 +176 +I/O rate std deviation +0 +0 +0 +0 +It can be inferred from these results that our proposed architecture performed better in terms of throughput and in terms of I/O rate. +VIII. FUTURE WORK AND CONCLUSIONS +Cloud computing enable companies outsource IaaS, PaaS and SaaS on-demand to reduce costs. One of the areas cloud computing is increasingly being utilized for is large scale data processing. Apache Hadoop is one such attempt to support data-intensive distributed applications. Hadoop applications utilize a primary distributed file system for data storage called Hadoop Distributed File System (HDFS). HDFS Datanodes’ metadata is restricted by the capacity of the RAM of the HDFS’s single-point-of-failure NameNode. This paper proposes a fault tolerant, highly available and widely scalable HDFS architecture whose NameNode is distributed and will not suffer HDFS failure in case of a single NameNode failure. We achieved this by utilizing the Chord protocol and integrate it with HDFS NameNode. Not only a little complexity is introduced into the HDFS NameNode by this approach, our proposed architecture will highly improve the availability and scalability of HDFS architecture including its single-point-of-failure. As a future work, we are planning to conduct extensive experiments and build a prototype as a result of our future extensive evaluation process. +ACKNOWLEDGMENT +The author acknowledges the support provided by King Fahd University of Petroleum and Minerals (KFUPM). This project is funded by King Abdulaziz City for Science and Technology (KACST) under the National Science, Technology, and Innovation Plan (project number 11-INF1657-04). +REFERENCES +[1] Michael Armbrust et al. Above the Clouds: A Berkeley View of Cloud Computing. Technical report EECS-2009-28, UC Berkeley, http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.html, Feb. 2009. +[2] Amazon web services economics center. http://aws.amazon.com/economics/ . +[3] http://en.wikipedia.org/wiki/Hadoop +[4] http://hadoop.apache.org/#What+Is+Hadoop%3F +[5] http://hadoop.apache.org/hdfs/ +[6] http://hadoop.apache.org/hdfs/docs/current/hdfs_user_guide.html +[7] http://hadoop.apache.org/hdfs/docs/current/hdfs_design.html +[8] http://en.wikipedia.org/wiki/MapReduce +[9] Ion Stoica , Robert Morris , David Liben-Nowell, David Karger , M. Frans Kaashoek , Frank Dabek, and Hari Balakrishnan, ―Chord: a scalable peer-to-peer lookup protocol for internet applications‖, IEEE/ACM TRANSACTIONS ON NETWORKING, Vols. 11, No. 1, pp. 17-32, Feb. 2003. +[10] D. R. Karger, E. Lehman, F. Leighton, M. Levine, D. Lewin, and R. Panigrahy, ―Consistent hashing and random trees: Distributed caching protocols for relieving hot spots on the WorldWideWeb,‖ in Proc. 29th Annu. ACM Symp. Theory of Computing, El Paso, TX, May 1997, pp. 654–663. +[11] R. Cox, A. Muthitacharoen, and R. Morris, ―Serving DNS using Chord,‖ in Proc. 1st Int. Workshop Peer-to-Peer Systems , Cambridge, MA, Mar. 2002. +[12] F. Dabek, F. Kaashoek, D. R. Karger, R. Morris, and I. Stoica, ―Wide-area cooperative storage with CFS,‖ in Proc. ACM Symp. Operating Systems Principles, Banff, Canada, 2001, pp. 202–215. +[13] D. Liben-Nowell, H. Balakrishnan, and D. R. Karger, ―Analysis of the evolution of peer-to-peer systems,‖ in Proc. 21st ACM Symp. Principles of Distributed Computing (PODC), Monterey, CA, July 2002, pp. 233–242. +[14] D. R. Karger, E. Lehman, F. Leighton, M. Levine, D. Lewin, and R. Panigrahy, ―Consistent hashing and random trees: Distributed caching 160 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. +protocols for relieving hot spots on theWorldWideWeb,‖ in Proc. 29th Annu. ACM Symp. Theory of Computing, El Paso, TX, May 1997, pp. 654–663. +[15] D. Lewin, ―Consistent hashing and random trees: Algorithms for caching in distributed networks,‖ Master’s thesis, Department of Electric. Eng. Comput. Sci., Massachusetts Inst. Technol., Cambridge, 1998. +[16] ―Secure Hash Standard,‖ U.S. Dept. Commerce/NIST, National Technical Information Service, Springfield, VA, FIPS 180-1, Apr. 1995 +[17] Zoltán Lajos Kis, Róbert Szabó, ―Interconnected Chord-rings‖, Network Protocols and Algorithms, Vol. 2, No. 2, 2010. +161 +Authorized licensed use limited to: BEIHANG UNIVERSITY. Downloaded on September 12,2021 at 03:53:07 UTC from IEEE Xplore. Restrictions apply. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop HDFS/Towards A Scalable HDFS Architecture.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..72f6ee212878baefb8a042b43566089555c9e20b GIT binary patch literal 86016 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∨(0;U@IMJ5EEnP#>1a|2yel$t1i{ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-relation.txt new file mode 100644 index 0000000..5329a9c --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-relation.txt @@ -0,0 +1,920 @@ +mobile robot view project early detection&page&依赖 +Alzheimer&project& +mobile robot view project early detection&content&依赖 +Landmines detection&Mohammed Elmogy&依赖 +t�cnica vitivin�cola � july 2016 citation&READS&依赖 +a big data processing framework based&2,529 3 author&依赖 +mobile robot view project early detection&page&依赖 +Landmines detection&22 july 2016&依赖 +disease view project mohammed elmogy mansoura university 227 publication&1,801 citation&依赖 +a big data processing framework based&2,529 3 author&依赖 +mobile robot view project early detection&content&依赖 +author&publication&AGGREGATION +user&downloaded file&依赖 +user&enhancement&依赖 +enhancement&downloaded file&AGGREGATION +faculty and Egypt&Computers and Information&AGGREGATION +Faculty and Mansoura and Egypt&Computers and Information&AGGREGATION +mansoura university iot )&enormous storage challenge&依赖 +Internet&thing&AGGREGATION +Faculty&Computers and Information&AGGREGATION +IoT application&extensive development&依赖 +expansion&flow&依赖 +expansion&computational asset&AGGREGATION +flow&datum&AGGREGATION +expansion&datum&依赖 +expansion&significant effect&依赖 +vast flow&datum&AGGREGATION +vast flow&Big datum&依赖 +it&interesting information&依赖 +it&behavior and business intelligence&依赖 +user&behavior& +form&data resource&AGGREGATION +results and discussion&big datum iot-based smart application&依赖 +results and discussion&feasible solution&依赖 +we&clean noisy datum ( svd&依赖 +we&knn ) technique&依赖 +we&C-mean&依赖 +hybrid technique&C-mean&AGGREGATION +we&hybrid technique&依赖 +we&C-mean&依赖 +we&hybrid technique&依赖 +clustering technique&technique&GENERALIZATION +clustering technique&MapReduce model&实现 +MapReduce&most admit framework&依赖 +MapReduce&processing&依赖 +used technique&scalability&依赖 +it&huge dataset&依赖 +it&addition&依赖 +it&meaningful information&依赖 +accuracy&proposed framework&AGGREGATION +Internet iot )&thing&AGGREGATION +connection&variety&依赖 +connection&item&依赖 +connection&Internet&依赖 +connection&view information device&依赖 +variety&view information device&AGGREGATION +object&information&依赖 +object&information&依赖 +aim&perspective recognition&AGGREGATION +essential thought&thing&依赖 +essential thought&IoT&AGGREGATION +Figure 1&iot and big datum&依赖 +Figure 1&relationship&依赖 +sensor datum&big datum&依赖 +datum&IoT&依赖 +datum&most important part&依赖 +most important part&IoT&AGGREGATION +nature&IoT&AGGREGATION +billion&object&AGGREGATION +datum&IoT&依赖 +datum&sensor&依赖 +datum&nature&依赖 +various type&sensor&AGGREGATION +datum&various type&依赖 +It&discernment device&依赖 +datum&next challenges :&依赖 +datum&considered thing&依赖 +datum&next challenges :&依赖 +datum&considered thing&依赖 +huge number&discernment device&AGGREGATION +It&huge number&依赖 +massive scale&IoT&AGGREGATION +device&datum&依赖 +quick development&information scale&AGGREGATION +They&varied resources and heterogeneity&依赖 +They&IoT datum&依赖 +Different&observation gadget&AGGREGATION +varied resources and heterogeneity&IoT datum&AGGREGATION +gathered datum&different semantics and structure&依赖 +vast majority&IoT application&AGGREGATION +It&way&依赖 +IoT&communitarian&依赖 +IoT&data distribution&依赖 +2016 ) 4 interval&rescue vehicle&AGGREGATION +sort&assistant medical strategy&AGGREGATION +sort&what&依赖 +It&IoT&依赖 +It&principal issue&依赖 +application&IoT&AGGREGATION +It&application&依赖 +it&most part&依赖 +it&few sensor&依赖 +it&all while screen various pointer and dampness , light , and weight&依赖 +specimen information&line&依赖 +specimen information&information&GENERALIZATION +datum&volume&依赖 +they&mixed bag&依赖 +huge measure&dissimilar information&AGGREGATION +a thought or ideal model&gathering , and utilization&依赖 +Big datum&choice making&依赖 +Big datum&different universe&依赖 +Big datum&3 ]&依赖 +point&view&AGGREGATION +They&online networking&依赖 +They&sensor device&依赖 +big data 4v&volume , velocity , variety ,&依赖 +Figure 2&big data 4v&依赖 +It&big data sequence&依赖 +issues and technology&accessibility&依赖 +substantial volume&datum&AGGREGATION +accessibility&substantial volume&AGGREGATION +issues and technology&substantial volume&依赖 +organization&that&依赖 +issues and technology&datum&依赖 +rest&paper&AGGREGATION +Section 2&basic concept&依赖 +Section 3¤t related work&依赖 +Section 4&proposed system&依赖 +implementation result&proposed technique&AGGREGATION +implementation result&benchmark dataset&依赖 +implementation result&Section 5&依赖 +conclusion and future work&Section 6&依赖 +CONCEPTS&MapReduce&依赖 +one&perfect choice&AGGREGATION +perfect choice&programming paradigm&AGGREGATION +user&map function&依赖 +map function&pair&依赖 +map function&function&GENERALIZATION +map function&group&依赖 +pair&key-value&AGGREGATION +map function&intermediate key-value set&依赖 +group&intermediate key-value set&AGGREGATION +It&a reduce function&依赖 +MapReduce architecture&architecture&GENERALIZATION +MapReduce architecture&Figure 3&依赖 +MapReduce framework&framework&GENERALIZATION +reduce function&reduce function&实现 +MapReduce framework&large dataset&依赖 +mapper&mass&依赖 +mapper&datum&依赖 +mass&datum&AGGREGATION +reducer&intermediate result&依赖 +block diagram&MapReduce&AGGREGATION +block diagram&datum&依赖 +we&CSV extension&依赖 +we&data store&依赖 +we&dataset&依赖 +data store&datum&依赖 +data store&tabular datastore object&依赖 +we&' name&依赖 +we&dataset&依赖 +variables&names& +' name feature&working&依赖 +user&needs& +specified variable&need&AGGREGATION +' name feature&permit&依赖 +user&preview command&依赖 +Figure&generic map function&依赖 +function&coder&依赖 +We&intermediate key and intermediate value&依赖 +we&dataset&依赖 +we&specific value&依赖 +we&set&依赖 +we&key-value&依赖 +set&key-value&AGGREGATION +large dataset initialize datastore variable&large dataset&依赖 +Add&select variable&依赖 +Add&datastore&依赖 +block diagram&generic map function&AGGREGATION +c. map function datum key-value store subset term generic map function&intermediate key-value store add set&依赖 +intermediate key-value store add set&intermediate key&AGGREGATION +c. map function datum key-value store subset term generic map function&intermediate key&依赖 +condition&key-value pair Create output store&AGGREGATION +Map function&function&GENERALIZATION +partition&key-value condition&依赖 +partition&datum&AGGREGATION +Data Intermediate key-value store Map function&key-value pair Create output store&依赖 +Data Intermediate key-value store Map function&condition&依赖 +block diagram&map function&AGGREGATION +Figure 6&Map function&依赖 +Map function&table&依赖 +Map function&variable&依赖 +variables&property& +subset&selected key&依赖 +subset&condition value&依赖 +subset&dataset&AGGREGATION +condition value&value&GENERALIZATION +map function extract&subset&依赖 +condition value&selected key&AGGREGATION +map function extract&dataset&依赖 +Reduce&one key&依赖 +block diagram&of&AGGREGATION +block diagram&reduce function&依赖 +load&different point&AGGREGATION +we&one&依赖 +separation&Epsilon&AGGREGATION +piece&" cluster&AGGREGATION +one&them&AGGREGATION +we&them&依赖 +they&Create&依赖 +we&cluster&依赖 +more than minpoint point&Intermediate value Key-value store&AGGREGATION +greater part&new point&AGGREGATION +they&more than minpoint point&依赖 +Get all intermediate result&intermediate value&依赖 +output value&value&GENERALIZATION +Get all intermediate result&output value&依赖 +2016 ) 9 separation&epsilon&AGGREGATION +part&other group&AGGREGATION +its&Epsilon& +it&other group&依赖 +minpoint point&Epsilon&依赖 +minpoint point&Epsilon&依赖 +noise&point&GENERALIZATION +it&" noise point "&依赖 +whose&items& +each core-point c&edge&依赖 +each core-point c&edge&依赖 +each core-point c&c&依赖 +each core-point c&c&依赖 +each core-point c&edge&依赖 +each core-point c&edge&依赖 +each core-point c&c&依赖 +- neighborhood&c 3&AGGREGATION +each core-point c&edge&依赖 +each core-point c&c&依赖 +each core-point c&c&依赖 +item&graph&AGGREGATION +core point&point&GENERALIZATION +let x&1&依赖 +set&node&AGGREGATION +dataset&n cluster&依赖 +data point&cluster&依赖 +high level&relationship&AGGREGATION +cluster&relationship&依赖 +cluster&cluster&依赖 +cluster&high level&依赖 +data point&point&GENERALIZATION +data point&cluster&依赖 +data point&association&依赖 +data point&cluster&依赖 +low level&association&AGGREGATION +data point&low level&依赖 +center&cluster&AGGREGATION +technique&pattern recognition&依赖 +It&minimization&依赖 +It&objective function&依赖 +minimization&objective function&AGGREGATION +membership&xus&AGGREGATION +cj&following equation [ 6 ]&依赖 +cj¢er&依赖 +cj&cj = σn i = 1 ( mm ij&依赖 +| | * | |&measured datum&依赖 +ith&d-dimensional measured datum&AGGREGATION +degree&membership&AGGREGATION +cj&cluster&依赖 +d-dimension center&cluster&AGGREGATION +FCM sequentially&dataset&依赖 +FCM sequentially&right area&依赖 +FCM sequentially&cluster center&依赖 +FCM clustering strategy&fuzzy behavior&依赖 +they&method&依赖 +fuzzy behavior&issn :0254 -0223 vol&依赖 +7&clustering&依赖 +membership weight&a characteristic translation but not probabilistic&依赖 +membership weight&all&依赖 +outcome&item&依赖 +outcome&2.4 K&依赖 +estimation&item&AGGREGATION +outcome&KNN regression&依赖 +its&neighbors& +value&k-closest neighbor&依赖 +value&estimation&依赖 +estimation&k-closest neighbor&AGGREGATION +Euclidean distance&distance&GENERALIZATION +KNN&Euclidean distance&依赖 +KNN&labeled example&依赖 +KNN&Euclidean distance&依赖 +KNN&following equation [ 8 ]&依赖 +it&overall noise&依赖 +top K-number&adjacent neighbor&AGGREGATION +labeled example&highest distance&依赖 +It&detail&依赖 +n row&datum&依赖 +2.5 SINGULAR VALUE DECOMPOSITION SVD&datum&依赖 +rectangular matrix&datum&AGGREGATION +p column&experimental property&依赖 +2.5 SINGULAR VALUE DECOMPOSITION SVD&rectangular matrix&依赖 +same dimension&singular value&依赖 +VT&row&依赖 +SVD&outline&依赖 +SVD&coordinate system&依赖 +coordinate system&system&GENERALIZATION +SVD&original datum&依赖 +outline&original datum&AGGREGATION +eigenvector&a relate to&AGGREGATION +SVD&equation&依赖 +x&a relate to&依赖 +eigenvalue&A&AGGREGATION +eigenvalues and eigenvector&AAT or ATA&AGGREGATION +computation&SVD&AGGREGATION +singular value&AAT or ATA&依赖 +column&V&AGGREGATION +column&U.&AGGREGATION +eigenvector&column&依赖 +singular value&AAT or ATA&依赖 +eigenvector&V&依赖 +singular value&AAT or ATA&依赖 +eigenvector&U.&依赖 +singular value&eigenvalue&依赖 +square root&eigenvalue&AGGREGATION +singular value&AAT or ATA&依赖 +singular value&eigenvalue&依赖 +eigenvector&ATA&AGGREGATION +eigenvector&column&依赖 +eigenvector&AAT&AGGREGATION +diagonal entry&S matrix&AGGREGATION +S matrix&matrix&GENERALIZATION +singular value&S matrix&依赖 +SVD feature&matrix&依赖 +SVD feature&nearest rank-l estimation&依赖 +number&outstanding singular value&AGGREGATION +we&matrix estimation&依赖 +whose&rank& +whose rank&outstanding singular value&依赖 +whose rank&number&依赖 +7&important research topic&依赖 +Many researcher&field&依赖 +MapReduce technique&technique&GENERALIZATION +Tao&MapReduce technique&依赖 +light&K-means clustering calculation&AGGREGATION +They&light&依赖 +They&K-means clustering calculation&依赖 +They&monstrous little datum&依赖 +They&procedure&依赖 +outcome&information prepare proficiency&依赖 +Their&outcomes& +They&Kmeans calculation&依赖 +They&Kmeans calculation&依赖 +They&MapReduce&依赖 +They&view&依赖 +view&MapReduce&AGGREGATION +they&datum&依赖 +they&record&依赖 +they&converging&依赖 +converging&datum&AGGREGATION +they&cluster&依赖 +datum&high likeness&依赖 +datum&high likeness&依赖 +merger technique&technique&GENERALIZATION +merger technique&little information&AGGREGATION +exploration&little information&依赖 +exploration&them&依赖 +exploration&IoT&依赖 +exploration&merger technique&依赖 +number&cluster&AGGREGATION +Xu and Xun [ 11 ]&distributed computing&依赖 +MapReduce model&distributed computing&AGGREGATION +Xu and Xun [ 11 ]&MapReduce model&依赖 +they&MapReduce&依赖 +instrument&MapReduce&AGGREGATION +they&instrument&依赖 +key innovation&IoT&AGGREGATION +they&structural planning attribute&依赖 +They&IoT world&依赖 +IoT world&world&GENERALIZATION +They&information and datum&依赖 +They&conveyed mining&依赖 +they&stream information distribution&依赖 +deficiency&conventional Apriori calculation&AGGREGATION +Apriori&lower mining proficiency&依赖 +mining technique&stream information investigation , group and so on&依赖 +mining technique&technique&GENERALIZATION +mining technique&stream information investigation , group and so on&依赖 +mining technique&stream information investigation , group and so on&依赖 +They&system&依赖 +security&information&AGGREGATION +proposed system&low effectiveness&依赖 +its&usage& +Wang et al. [ 12 ]&structural planning&依赖 +Wang et al. [ 12 ]&agribusiness&依赖 +structural planning&IoT&AGGREGATION +Wang et al. [ 12 ]&IoT&依赖 +IoT&distributed processing&依赖 +structural planning&enormous sensor information&依赖 +sensor information&information&GENERALIZATION +structural planning&constant read or access&依赖 +XML document&standard&依赖 +organization&heterogeneous sensor datum&AGGREGATION +XML document&heterogeneous sensor datum&依赖 +XML document&standard&依赖 +XML document&organization&依赖 +lack&variety&AGGREGATION +variety&sensor datum&AGGREGATION +ClustBigFIM method&method&GENERALIZATION +Gole and Tidk [ 13 ]&ClustBigFIM method&依赖 +improvement&BigFIM algorithm&AGGREGATION +ClustBigFIM&BigFIM algorithm&依赖 +improvement&information&依赖 +improvement&velocity&依赖 +other data mining mission&good vision&依赖 +They&manner&依赖 +manner&association&AGGREGATION +They&association&依赖 +It&frequent item&依赖 +flow&information&AGGREGATION +It&Big datum&依赖 +Li et al. [ 1 ]&storage managing clarification&依赖 +storage managing clarification&managing clarification&GENERALIZATION +They&managing clarification&依赖 +IOTMDB&save&依赖 +Their&work& +they&addition&依赖 +they&massive IoT data ISSN :0254 -0223 Vol&依赖 +its&value& +diverse structure&sensor&依赖 +Mesiti and Valtolina [ 14 ]&structure&依赖 +diverse structure&sensor&依赖 +information accumulation&database&依赖 +they&answer&依赖 +world&Big information investigation strategy&依赖 +answer&information&依赖 +answer&heterogeneous sensor&依赖 +NoSQL framework&framework&GENERALIZATION +NoSQL framework&reasonable mapping&依赖 +They&easy to use loading framework&依赖 +zhan et al. [ 15 ]&massive data processing model&依赖 +zhan et al. [ 15 ]&zhan et al. [ 15 ]&依赖 +zhan et al. [ 15 ]&zhan et al. [ 15 ]&依赖 +zhan et al. [ 15 ]&massive data processing model&依赖 +zhan et al. [ 15 ]&zhan et al. [ 15 ]&依赖 +zhan et al. [ 15 ]&massive data processing model&依赖 +zhan et al. [ 15 ]&zhan et al. [ 15 ]&依赖 +zhan et al. [ 15 ]&massive data processing model&依赖 +zhan et al. [ 15 ]&zhan et al. [ 15 ]&依赖 +zhan et al. [ 15 ]&massive data processing model&依赖 +zhan et al. [ 15 ]&zhan et al. [ 15 ]&依赖 +zhan et al. [ 15 ]&massive data processing model&依赖 +type&data resource&AGGREGATION +Their&model& +They&two main point&依赖 +they&cloudf&依赖 +they&Cloud Manager DB&实现 +variety&datum&AGGREGATION +galache et al. [ 16 ]&galache et al. [ 16 ]&依赖 +galache et al. [ 16 ]&galache et al. [ 16 ]&依赖 +nation&city resource&依赖 +Their&issue& +they&care&依赖 +they&resource&依赖 +they&resource&依赖 +they&resource&依赖 +they&resource&依赖 +they&care&依赖 +care&resource&AGGREGATION +they&care&依赖 +they&care&依赖 +set&smart IoT service&AGGREGATION +proposed framework&three-layer architecture&依赖 +asset&effective IoT benefit&依赖 +asset&Cloud&依赖 +Sowe et al.&answer&依赖 +Sowe et al.&massive heterogeneous sensor information issue&依赖 +They&join&依赖 +distinctive type&information&AGGREGATION +It&key middleware&依赖 +It&a service-controlled networking ( scn )&依赖 +It&sensor information&依赖 +It&client&依赖 +They&harvester ( udh ) advancement&依赖 +They&SCN&依赖 +portable detecting information&paper&依赖 +They&structure&依赖 +Cecchinel et al. [ 18 ]&programming structure&依赖 +programming structure&structure&GENERALIZATION +structure&dataset&依赖 +utilization measure&dataset&AGGREGATION +dataset&SMARTCAMPUS venture&依赖 +structural engineering&SMARTCAMPUS venture&依赖 +Their&engineering& +structural engineering&genuine prerequisite&依赖 +work&Big data accumulation stage&依赖 +work&way&依赖 +work&Big data accumulation stage&依赖 +way&Big data accumulation stage&AGGREGATION +work&way&依赖 +They&ISSN :0254 -0223 Vol&依赖 +its&applications& +programming model&client&依赖 +system programming&off chance&依赖 +they&new information&依赖 +Mishra et al. [ 19 ]&valuable data administration and knowledge detection&依赖 +Mishra et al. [ 19 ]&IoT Big datum&依赖 +Mishra et al. [ 19 ]&a cognitive-oriented iot big-da framework ( coib )&依赖 +They&huge scale mechanical computerization environment&依赖 +They&general IoT Big data layered design&依赖 +They&COIB system&依赖 +usage&COIB system&AGGREGATION +They&general IoT Big data layered design&依赖 +COIB system&system&GENERALIZATION +They&mining and examination huge information&依赖 +proposed system&store and retrieve iot big datum&依赖 +trillion&IoT item&AGGREGATION +proposed system&solution&依赖 +their&work& +our&system& +accuracy&datum&AGGREGATION +proposed system&datum&依赖 +proposed system&datum&依赖 +proposed system&massive number&依赖 +massive number&datum&AGGREGATION +proposed system&massive number&依赖 +we&datum&依赖 +we&noise&依赖 +we&big datum&依赖 +we&kennard sample and svd&依赖 +data reduction technique&big datum&依赖 +data reduction technique&IoT&依赖 +we&IoT&依赖 +we&mutual information algorithm&依赖 +we&datum clustering&依赖 +we&vast store&依赖 +we&MapReduce&依赖 +proposed system figure 8&proposed system figure 8&依赖 +proposed system&massive – heterogeneous sensor datum&AGGREGATION +proposed system&massive – heterogeneous sensor datum&依赖 +noiseless datum issn :0254 -0223 vol&noiseless datum issn :0254 -0223 vol&依赖 +Variety sensor raw datum datum cleaning data integration datum processing ( clustering&sensor raw datum datum cleaning data integration datum processing ( clustering&AGGREGATION +Variety sensor raw datum datum cleaning data integration datum processing ( clustering&little size clean&依赖 +Variety sensor raw datum datum cleaning data integration datum processing ( clustering&datum datum&依赖 +Variety sensor raw datum datum cleaning data integration datum processing ( clustering&datum datum&依赖 +Variety sensor raw datum datum cleaning data integration datum processing ( clustering&little size clean&依赖 +proposed system&data preprocessing and data processing phase&依赖 +proposed system&two main phase&依赖 +dataset&stage&依赖 +dataset&different sensor&依赖 +utilization&kennard sampling&AGGREGATION +dimensionality&datum&AGGREGATION +execution time&datum processing&AGGREGATION +last stage&correlation and mutual information&依赖 +last stage&aiming&依赖 +it&data distribution&依赖 +performance&big datum&AGGREGATION +main stage&detail&依赖 +main stage&subsection&依赖 +main stage&two phase&AGGREGATION +preprocessing&data science&依赖 +it&choice&依赖 +data mining method&raw datum&依赖 +data mining method&reasonable information&依赖 +It&association&依赖 +It&database-driven application&依赖 +step&detail&依赖 +step&subsection&依赖 +confusion&real information&依赖 +more than 30 %&real information&AGGREGATION +confusion&more than 30 %&依赖 +it&addition&依赖 +it&cost [ 21 ]&依赖 +It&datum&依赖 +rest&datum&AGGREGATION +it&size&依赖 +nominal attribute&datum&AGGREGATION +It&datum&依赖 +help&many technique&AGGREGATION +mean&numeric attribute or mode&AGGREGATION +It&KNN algorithm&依赖 +It&discrete and continuous attribute&依赖 +knn search&datum&依赖 +It&dataset&依赖 +It&most probable value&依赖 +We&data cleaning&依赖 +We&KNN algorithm&依赖 +block diagram&datum cleaning step&AGGREGATION +block diagram&datum cleaning step&依赖 +figure 9 show&noisy data and outlier&依赖 +figure 9 show&many challenge&依赖 +repetition&datum&AGGREGATION +value&KNN regression&依赖 +value&most probable value&依赖 +b ) data reduction a monstrous measure&different source&依赖 +b ) data reduction a monstrous measure&different source&依赖 +logistics insight&example&依赖 +logistics insight&r&d [ 23 ]&依赖 +logistics insight&r&d [ 23 ]&依赖 +b ) data reduction a monstrous measure&information&AGGREGATION +extraordinary difficulty term&computational manysided quality and characterization execution&AGGREGATION +Highdimensional information&computational manysided quality and characterization execution&依赖 +Highdimensional information&extraordinary difficulty term&依赖 +it&low-dimensional component space&依赖 +block diagram&data reduction step&依赖 +block diagram&data reduction step&依赖 +list&highest smallest distance&AGGREGATION +Kennard sample&time&依赖 +Kennard sample&number&依赖 +Kennard sample&iteration&依赖 +number&iteration&AGGREGATION +We&SVD&依赖 +dimensionality&large dimensional datum&AGGREGATION +SVD Input data De-duplication Detect outlier Replace&value&依赖 +SVD Input data De-duplication Detect outlier Replace&Input datum&依赖 +purpose&access&AGGREGATION +Big datum&huge volume&依赖 +Big datum&organization&依赖 +number&different source&AGGREGATION +It&diverse structure&依赖 +It&–&依赖 +this immense , various sort&information&AGGREGATION +organization&speedy , exact , and significant bit&依赖 +organization&knowledge [ 26 ]&依赖 +speedy , exact , and significant bit&knowledge [ 26 ]&AGGREGATION +Mutual information&relationship&依赖 +Mutual information&attribute&依赖 +( y ) ] ( 10 )&( x&依赖 +( y ) ] ( 10 )&[ 27 ]&依赖 +equation&mutual information&AGGREGATION +( y ) ] ( 10 )&y ) log2 [ p ( x&依赖 +two dimension&dataset&AGGREGATION +X and Y&dataset&依赖 +control&information processing&AGGREGATION +information processing&processing&GENERALIZATION +Data Processing Phase Data processing phase&information processing&依赖 +handling&information&AGGREGATION +Information preparation&handling&依赖 +Information preparation&information&依赖 +Massive datum&processing&依赖 +Massive datum&data store&依赖 +tremendous measure&comparative quality&AGGREGATION +We&MapReduce&依赖 +hybrid&FCM and DBSCAN&AGGREGATION +We&MapReduce&依赖 +We&MapReduce&依赖 +minimum point&minimum value&依赖 +minimum value&point&AGGREGATION +FCM-DBSCAN Map function&Map function&GENERALIZATION +minimum point&point&依赖 +we&FCM-DBSCAN Map function&依赖 +epsilon value¢er and point&依赖 +epsilon value&distance&依赖 +minimum point&cluster&依赖 +we&minimum point&依赖 +we&equation&依赖 +points and center&cluster&AGGREGATION +we¢er&依赖 +we&cluster&依赖 +epsilon value&value&GENERALIZATION +point and center&cluster equal&AGGREGATION +distance&greater&依赖 +distance&greater&依赖 +distance&epsilon value&依赖 +point&cluster&依赖 +point&neighborpt&依赖 +distance&epsilon value&依赖 +distance&greater&依赖 +distance&epsilon value&依赖 +point&cluster&依赖 +We&key&依赖 +It&reach&依赖 +It&convergence state&依赖 +7 and 2016 ) 17 fcm-dbscan map function fcm-dbscan ( d&number&依赖 +7 and 2016 ) 17 fcm-dbscan map function fcm-dbscan ( d&cluster&依赖 +7 and 2016 ) 17 fcm-dbscan map function fcm-dbscan ( d&cluster&依赖 +7 and 2016 ) 17 fcm-dbscan map function fcm-dbscan ( d&number&依赖 +7 and 2016 ) 17 fcm-dbscan map function fcm-dbscan ( d&number&依赖 +7 and 2016 ) 17 fcm-dbscan map function fcm-dbscan ( d&cluster&依赖 +each point p&dataset D&依赖 +each point p&each point p&依赖 +each point p&dataset D&依赖 +each point p&each point p&依赖 +each point p&each point p&依赖 +each point p&dataset D&依赖 +input&FCM-DBSCAN Reduce function&依赖 +final cluster point&C cluster&依赖 +final cluster point&previous cluster point&依赖 +final cluster point&addition&依赖 +C cluster&cluster&GENERALIZATION +final cluster point¤t cluster point&依赖 +a point issn&:0254 -0223 Vol&依赖 +all point&cluster&依赖 +all point&cluster&依赖 +all point&cluster&依赖 +neighbor point&minimum point&依赖 +minimum point&point&GENERALIZATION +neighbor point&neighbor point&依赖 +output&datum&依赖 +output&cluster&依赖 +cluster&datum&AGGREGATION +set&cluster&AGGREGATION +raw datum&different sensor&依赖 +problem&sensor datum&依赖 +our propose work aim&problem&依赖 +Our&work& +raw datum&different sensors and store&依赖 +we&datum&依赖 +datum&noise&依赖 +datum&KNN&依赖 +We&KNN&依赖 +cleared datum&SVD algorithm&依赖 +significant vision&datum&AGGREGATION +it&time&依赖 +proposed model&data processing step&依赖 +clustering algorithm&entity&依赖 +clustering algorithm&space&依赖 +arrangement&entity&AGGREGATION +clustering algorithm&arrangement&依赖 +It&diverse forms and size&依赖 +It&cluster&依赖 +It&diverse forms and size&依赖 +It&cluster&依赖 +It&diverse forms and size&依赖 +huge quantity&datum&AGGREGATION +It&diverse forms and size&依赖 +cluster&diverse forms and size&AGGREGATION +It&cluster&依赖 +It&cluster&依赖 +RESULTS&29 ]&依赖 +RESULTS&ordinary IADL housekeeping activity&依赖 +general interval&dataset&AGGREGATION +usual spreading&activity&AGGREGATION +interval&activity&依赖 +interval&usual spreading&依赖 +interval&daily life&依赖 +Porcupine sensor&sensor&GENERALIZATION +They&ibracelet&依赖 +They&acceleration and RFID tag detection&依赖 +They&Porcupine sensor&依赖 +dataset&estimation&依赖 +estimation&1048576 record&AGGREGATION +dataset&1048576 record&依赖 +We&proposed technique and core ( tm )&实现 +We&2 due , 2 gh processor&实现 +part&used dataset&AGGREGATION +Figure 11&part&依赖 +Figure 11&used dataset&依赖 +act&activity label result&依赖 +act&iron&依赖 +Acc&acc3&依赖 +beginning&recording&AGGREGATION +Time&elapsed number&依赖 +Time&second&依赖 +elapsed number&second&AGGREGATION +Acc&real time clock [ ddmmyyhhmmss ]&依赖 +Time&elapsed number&依赖 +Time&second&依赖 +Time&second&依赖 +Time&elapsed number&依赖 +Figure 12&outlier detection&依赖 +value&state&依赖 +value&outlier&依赖 +value&state&依赖 +value&outlier&依赖 +value&field&AGGREGATION +observation&value&依赖 +expected scope&value&AGGREGATION +observation&experiment&依赖 +outlier&measurement or experimental error indication&依赖 +outlier&dataset&依赖 +outlier&value&依赖 +figure 13 show&value&依赖 +reduction&dataset&AGGREGATION +datum&property&依赖 +smaller number&property&AGGREGATION +datum&smaller number&依赖 +attribute&priority&依赖 +attribute&priority&依赖 +SVD1&present the datum&依赖 +SVD1&highest probability&依赖 +outcome matrix&matrix&GENERALIZATION +Figure 15&outcome matrix&依赖 +Figure 15&mutual information&依赖 +measure&two variable&依赖 +measure&two variable&依赖 +measure&variables mutual dependence&AGGREGATION +trans-information&two variable&AGGREGATION +mutual information&association or correlation&依赖 +rate&association or correlation&AGGREGATION +mutual information&row and column variable&依赖 +mutual information&rate&依赖 +mutual information&2N&依赖 +mutual information&datum&依赖 +it&high relationship&依赖 +value&mutual information&AGGREGATION +it&attribute&依赖 +MapReduce function execution&MapReduce implementation&依赖 +MapReduce function execution&result datum&依赖 +Figure 16&read datum&依赖 +read datum&resulted attributes view&依赖 +read datum&resulted attributes view&依赖 +read datum&set&依赖 +Figure 16&MapReduce&依赖 +Figure 16&MapReduce&依赖 +read datum&set&依赖 +Figure 16&read datum&依赖 +set&resulted attributes view&AGGREGATION +Figure 17&MapReduce implementation&依赖 +dataset&Map&依赖 +we&MapReduce implementation&依赖 +we&data result&依赖 +preprocessing&dataset&AGGREGATION +time and accuracy&dataset&AGGREGATION +5.4 EVALUATION The evaluation&dataset&依赖 +5.4 EVALUATION The evaluation&time and accuracy&依赖 +time and accuracy&preprocessing&AGGREGATION +value&specificity&AGGREGATION +we&Big datum&依赖 +we&accuracy&依赖 +accuracy&Big datum&AGGREGATION +negative tuple&FN False negative&依赖 +positive tuple&ISSN :0254 -0223 Vol&依赖 +negative tuple&TN True negative&依赖 +positive tuple&FP False Positives&依赖 +our&FCM-DBSCAN& +clustering algorithm&PCA&依赖 +clustering algorithm&different data reduction algorithm&依赖 +we&table 2&依赖 +we&dataset&依赖 +we&proposed approach&依赖 +we&training data and testing datum&依赖 +we&tested datum&依赖 +performance measure&proposed system&AGGREGATION +expended time comparison&different reduction algorithm&依赖 +expended time comparison&different reduction algorithm&依赖 +we&high accuracy value&依赖 +its&approaches& +our&studies& +FCM-DBSCAN&accuracy&依赖 +FCM-DBSCAN&highest value&依赖 +FCM-DBSCAN&accuracy&依赖 +FCM-DBSCAN&highest value&依赖 +highest value&accuracy&AGGREGATION +K-Means and optics&nearest accuracy value&依赖 +optics&longer time&依赖 +EM algorithm&other technique&依赖 +EM algorithm&larger time&依赖 +DBSCAN&high accuracy&依赖 +accuracy&FCM-DBSCAN&依赖 +vast increase&device&AGGREGATION +massive amount&IoT datum&AGGREGATION +Big datum&massive datum&依赖 +massive datum&much time&依赖 +We&processing massive and heterogeneous datum&依赖 +We&IoT&依赖 +We&framework&依赖 +paper&Big datum&依赖 +paper&many viewpoint&依赖 +raw dataset&different sensor&依赖 +Our&system& +proposed system&problem&依赖 +architecture&optics em dbscan fcm-dbscan pca pca kernel ica som svd issn :0254 -0223 vol&依赖 +architecture&proposed system&AGGREGATION +architecture&optics em dbscan fcm-dbscan pca pca kernel ica som svd issn :0254 -0223 vol&依赖 +we&preprocessing phase&依赖 +datum&most probable value&依赖 +we&KNN&依赖 +MapReduce model&datum clustering&依赖 +MapReduce model&datum clustering&依赖 +MapReduce model&Map and Reduce function&依赖 +MapReduce model&Map and Reduce function&依赖 +MapReduce model&datum clustering&依赖 +MapReduce model&datum clustering&依赖 +MapReduce model&Map and Reduce function&依赖 +MapReduce model&Map and Reduce function&依赖 +processing time&proposed system&AGGREGATION +we&processing&实现 +we&processing&实现 +we&different dataset&实现 +we&different dataset&实现 +future work&time&依赖 +we&data query processing&实现 +best and suitable model&NoSQL database&AGGREGATION +NoSQL database&database&GENERALIZATION +we&NoSQL database&实现 +we&best and suitable model&实现 +We&Key-value database&依赖 +Key-value database&database&GENERALIZATION +key-value ( kv ) store&associative array&依赖 +approach&selective key range&依赖 +we&challenge&依赖 +[&1 ] li , t. , liu , y. , tian , y. , shen , s. , & mao and w. ( 2012 ) w. ( 2012 )&依赖 +Improvement&Analyze Cluster&依赖 +Improvement&Large dataset&依赖 +Improvement&dbscan algorithm&AGGREGATION +Improvement&Large dataset&依赖 +Improvement&Large dataset&依赖 +Improvement&Large dataset&依赖 +Improvement&Analyze Cluster&依赖 +Improvement&Analyze Cluster&依赖 +Improvement&Analyze Cluster&依赖 +Comparative Analysis&k-mean&AGGREGATION +http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&c. ( 2014 )&依赖 +http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&7 jan 2016&依赖 +http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&c. ( 2014 )&依赖 +http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&依赖 +http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&7 jan 2016&依赖 +http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&http://web.mit.edu/be.400/www/svd/singular_value_decomposition.htm [ 10 ] tao , x. & ji and c. ( 2014 )&依赖 +Management&Big Data&AGGREGATION +analysis&big datum&AGGREGATION +38th ieee annual international computers and Software&38th ieee annual international computers and Software&依赖 +management&massive IoT datum&AGGREGATION +collection&big datum&AGGREGATION +cognitive-oriented framework&iot big-data management prospective&依赖 +cognitive-oriented framework&iot big-data management prospective&依赖 +International Journal and ijact ) , 7 ( 5 ) and ijact ) , 7 ( 5 )&Advancements&AGGREGATION +new approachµarray data dimension reduction&AGGREGATION +data-pain-points [ 27 ] cover , t. & thomas and j. ( 2012 )&8 july 2015&依赖 +data-pain-points [ 27 ] cover , t. & thomas and j. ( 2012 )&http://data-informed.com/how-to-address-commonbig&依赖 +data-pain-points [ 27 ] cover , t. & thomas and j. ( 2012 )&8 july 2015&依赖 +data-pain-points [ 27 ] cover , t. & thomas and j. ( 2012 )&http://data-informed.com/how-to-address-commonbig&依赖 +element&information theory&AGGREGATION +Combination&RFID&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-simEnts.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-simEnts.txt new file mode 100644 index 0000000..80c99c0 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-simEnts.txt @@ -0,0 +1,74 @@ +Input,Input +Input,class TextInputFormat +Input,class SequenceFileInputFormat +Input,class CombineFileInputFormat +Input,class KeyValueTextInputFormat +Input,class FixedLengthInputFormat +Input,class NLineInputFormat +Input,class CombineFileRecordReader +Input,class KeyValueLineRecordReader +Input,class SequenceFileRecordReader +Input,class DBRecordReader +TextInputFormat,TextInputFormat +SequenceFileInputFormat,SequenceFileInputFormat +CombineFileInputFormat,CombineFileInputFormat +KeyValueTextInputFormat,KeyValueTextInputFormat +KeyValueTextInputFormat,KeyFilter +KeyValueTextInputFormat,Key questions +FixedLengthInputFormat,FixedLengthInputFormat +NLineInputFormat,NLineInputFormat +CombineFileRecordReader,CombineFileRecordReader +KeyValueLineRecordReader,KeyValueLineRecordReader +KeyValueLineRecordReader,Key questions +SequenceFileRecordReader,SequenceFileRecordReader +DBRecordReader,DBRecordReader +Map,Map +InverseMapper,InverseMapper +MultithreadedMapper,MultithreadedMapper +RegexMapper,RegexMapper +TokenCounterMapper,TokenCounterMapper +Partition,Partition +Partition,class KeyFieldBasedPartitioner +BinaryPartitioner,BinaryPartitioner +HashPartitioner,HashPartitioner +HashPartitioner,default Partitioner +KeyFieldBasedPartitioner,KeyFieldBasedPartitioner +KeyFieldBasedPartitioner,Key idea +RehashPartitioner,RehashPartitioner +TotalOrderPartitioner,TotalOrderPartitioner +Reduce,Reduce +Reduce,class IntSumReducer +Reduce,class LongSumReducer +Reduce,class FailJob +IntSumReducer,IntSumReducer +IntSumReducer,Reducer interfaces +IntSumReducer,ReducerFactory +IntSumReducer,Reducer aggregate +IntSumReducer,ReducerPhase +IntSumReducer,Reducer implementations +LongSumReducer,LongSumReducer +LongSumReducer,Reducer interfaces +LongSumReducer,ReducerFactory +LongSumReducer,Reducer aggregate +LongSumReducer,ReducerPhase +LongSumReducer,Reducer implementations +Output,Output +Output,class FileOutFormat +Output,class MapFileOutputFormat +Output,class SequenceFileOutputFormat +Output,class TextOutputFormat +Output,class MultipleOutputs +Output,class FileOutputCommitter +Output,class RecordWriter +MapFileOutputFormat,MapFileOutputFormat +MapFileOutputFormat,method Map +MapFileOutputFormat,Map Reduce papers +MapFileOutputFormat,MapTask +MapFileOutputFormat,FacebookMap +Map,class InverseMapper +Map,class MultithreadedMapper +Map,class RegexMapper +Map,class TokenCounterMapper +Map,class WrappedMapper +SequenceFileOutputFormat,SequenceFileOutputFormat +TextOutputFormat,TextOutputFormat diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-ziyan.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-ziyan.txt new file mode 100644 index 0000000..88c9d8c --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS-ziyan.txt @@ -0,0 +1,74 @@ +Input , Input +Input , class Text Input Format +Input , class Sequence File Input Format +Input , class Combine File Input Format +Input , class Key Value Text Input Format +Input , class Fixed Length Input Format +Input , class N Line Input Format +Input , class Combine File Record Reader +Input , class Key Value Line Record Reader +Input , class Sequence File Record Reader +Input , class D B Record Reader +Text Input Format , Text Input Format +Sequence File Input Format , Sequence File Input Format +Combine File Input Format , Combine File Input Format +Key Value Text Input Format , Key Value Text Input Format +Key Value Text Input Format , Key Filter +Key Value Text Input Format , Key questions +Fixed Length Input Format , Fixed Length Input Format +NLine Input Format , NLine Input Format +Combine File Record Reader , Combine File Record Reader +Key Value Line Record Reader , Key Value Line Record Reader +Key Value Line Record Reader , Key questions +Sequence File Record Reader , Sequence File Record Reader +DBRecord Reader , DBRecord Reader +Map , Map +Inverse Mapper , Inverse Mapper +Multithreaded Mapper , Multithreaded Mapper +Regex Mapper , Regex Mapper +Token Counter Mapper , Token Counter Mapper +Partition , Partition +Partition , class Key Field Based Partitioner +Binary Partitioner , Binary Partitioner +Hash Partitioner , Hash Partitioner +Hash Partitioner , default Partitioner +Key Field Based Partitioner , Key Field Based Partitioner +Key Field Based Partitioner , Key idea +Rehash Partitioner , Rehash Partitioner +Total Order Partitioner , Total Order Partitioner +Reduce , Reduce +Reduce , class Int Sum Reducer +Reduce , class Long Sum Reducer +Reduce , class Fail Job +Int Sum Reducer , Int Sum Reducer +Int Sum Reducer , Reducer interfaces +Int Sum Reducer , Reducer Factory +Int Sum Reducer , Reducer aggregate +Int Sum Reducer , Reducer Phase +Int Sum Reducer , Reducer implementations +Long Sum Reducer , Long Sum Reducer +Long Sum Reducer , Reducer interfaces +Long Sum Reducer , Reducer Factory +Long Sum Reducer , Reducer aggregate +Long Sum Reducer , Reducer Phase +Long Sum Reducer , Reducer implementations +Output , Output +Output , class File Out Format +Output , class Map File Output Format +Output , class Sequence File Output Format +Output , class Text Output Format +Output , class Multiple Outputs +Output , class File Output Committer +Output , class Record Writer +Map File Output Format , Map File Output Format +Map File Output Format , method Map +Map File Output Format , Map Reduce papers +Map File Output Format , Map Task +Map File Output Format , Facebook Map +Map , class Inverse Mapper +Map , class Multithreaded Mapper +Map , class Regex Mapper +Map , class Token Counter Mapper +Map , class Wrapped Mapper +Sequence File Output Format , Sequence File Output Format +Text Output Format , Text Output Format \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt new file mode 100644 index 0000000..e949014 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt @@ -0,0 +1,898 @@ +See discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/305489358 +A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH +APPLICATION TO INTERNET OF THINGS +Article in Ciência e Técnica Vitivinícola · July 2016 +CITATIONS +0 +READS +2,529 +3 authors, including: +Some of the authors of this publication are also working on these related projects: +Landmines detection using mobile robots View project +Early Detection for Alzheimer's Disease View project +Mohammed Elmogy +Mansoura University +227 PUBLICATIONS 1,801 CITATIONS +SEE PROFILE +All content following this page was uploaded by Mohammed Elmogy on 22 July 2016. +The user has requested enhancement of the downloaded file. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +2 +A BIG DATA PROCESSING FRAMEWORK +BASED ON MAPREDUCE WITH APPLICATION +TO INTERNET OF THINGS +1Heba, A., 2 Mohammed, E., 3 Shereif, B. +1 Information Systems Dept., Faculty of Computers and Information, +Mansoura University Mansoura, Egypt, hebaaly92@gmail.com +*2 Information Technology Dept., Faculty of Computers and Information, +Mansoura University, Mansoura, Egypt, melmogy@mans.edu.eg +3 Information Systems Dept., Faculty of Computers and Information, +Mansoura University, Mansoura, Egypt, sherifiib@yahoo.com +ABSTRACT +Massive and various data from the Internet of Things (IoT) generate enormous storage challenges. The +IoT applications caused an extensive development. In the past two decades, the expansion of +computational asset had a significant effect on the flow of the data. The vast flow of data is identified as +"Big data," which is the data that cannot be managed using current ordinary techniques or tools. If it is +correctly handled, it generates interesting information, such as investigating the user's behavior and +business intelligence. +In this paper, the proposed system is implemented to handle massive data with all forms of data +resources whether structured, semi-structured, and non-structured altogether. The results and discussion +show that the proposed system generates a feasible solution in applying big data IoT-based smart +applications. In the data preprocessing stage, we used the K-nearest neighbors (KNN) technique to clean +noisy data and a Singular Value Decomposition (SVD) to reduce data dimensionality. In the processing +stage, we proposed a hybrid technique of a Fuzzy C-mean and Density-based spatial clustering (FCMDBSCAN) +to deal with the applications with noise. The clustering technique is implemented on +MapReduce model. MapReduce is represented as the most admitted framework to operate processing on +big data. The MapReduce is the most principle model to deal with big data. The used technique is +providing scalability, rapidity, and well-fitting accuracy for storing big data. In addition, it is obtaining +meaningful information from huge datasets that give great vision to make effective outcomes using fast +and efficient processing platform. Experimental results show that the accuracy of the proposed +framework is 98.9% using IADL activities dataset. +KEYWORDS: Internet of Things (IoT); Big data; Singular Value Decomposition (SVD); FCMDBSCAN; +MapReduce. +1. INTRODUCTION +The IoT is the connection that joins items to the Internet over varieties of view +information devices. Therefore, all objects that can be addressed separately can +interchange information among each other, and eventually realize the aims of +perspective recognition, location, tracking, supervision, and administration [1]. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +3 +Figure 1. The Big data in IoT. +The essential thought of IoT is to interface all things on the planet to the Web. +It is normal that things can be recognized automatically, can speak with each +other, and also can even settle on choices without human interference [2]. Figure +1 shows the relationship between IoT and big data and how the sensor data +represented as big data. +Data are a standout amongst the most important parts of the IoT. In the nature +of the IoT, data are gathered from various types of sensors and speak to billions +of objects. In all considered things, the data on the IoT display the next +challenges: +- The massive scale of the IoT: It includes a huge number of discernment +devices. These devices are consistently and consequently gathering data, +which prompt a quick development of information scale. +- Different of observation gadgets: They inspect varied resources and +heterogeneity of the IoT data. The gathered data from distinctive devices +and measures have different semantics and structures. +- Interoperability: It indicates the way that the vast majority of the IoT +applications are currently secluded. In the long run, the IoT will need to +accomplish data distribution to encourage communitarian among diverse +applications. Taking telemedicine benefit as an instance, once a patient is +in crisis, the movement data is likewise expected to evaluate the landing +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +4 +interval of the rescue vehicle to choose what sort of assistant medical +strategy to take. +- Multi-dimensionality: It is considered as the principal issue in the +applications of the IoT. For the most part, it incorporates a few sensors to +all the while screen various pointers, such as temperature, dampness, light, +and weight. Along these lines, the specimen information is typically +multidimensional [1]. +Data are extensive in volume, so they are asserted in a mixed bag or moved +with such speed, which are called "Big data." It is not a thing; it is a thought or +ideal model that characterized the expanding, gathering, and utilization of huge +measures of dissimilar information. Big data is helping in choice making and +taking the business to a different universe [3]. +Big data started to be the point of view when the standard database frameworks +were not prepared to handle the unstructured data, such as weblogs, features, +photographs, social overhauls, and human conduct. They are produced by online +networking, sensor devices, or from some other data creating sources. +Figure 2. The Big data 4Vs and data sequence. +Figure 2 observes the big data 4Vs that includes volume, velocity, variety, and +veracity. It also describes the big data sequence. Some issues and technologies +are identified with the accessibility of greatly substantial volumes of data that +organizations need to join and get. There is a significant venture for a time, cash, +and assets that are expected to make this style of processing ordinary. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +5 +The rest of this paper is structured as follows. Section 2 shows some basic +concepts. Section 3 explains the current related work. Section 4 shows the +proposed system and explains each phase in detail. In Section 5, the +implementation results of the proposed techniques are discussed on a benchmark +dataset. Finally, the conclusion and future work are presented in Section 6. +2. BASIC CONCEPTS +2.1 MAPREDUCE +The Big data analytics society has admitted MapReduce as a programming +template for handling massive data on separated systems. MapReduce model +has become one of the perfect choices of the programming paradigm for +processing massive datasets. It is a paradigm for evolving a distributed +clarification for complicated difficulties over enormous datasets [4]. Users +identify a map function that handles a pair of key-value to produce a group of +intermediate key-value sets. In addition, It creates a reduce function that joins +all intermediate values related with the same intermediate key. The MapReduce +architecture is shown in Figure 3. +Figure 3. The MapReduce architecture. + MapReduce Algorithm +There are four steps to implement MapReduce framework, which includes reading a +large dataset, implementing the map function, implementing the reduce function, and +returning the resulting data from the map and reduce. The mapper receives masses of +data and produces intermediate results. The reducer reads the intermediate results and +emits a final result. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +6 +A. Read Large Dataset +Figure 4. The block diagram of MapReduce read data. +As shown in figure 4, we create a data store using the dataset with CSV extension. The +data store displays a tabular datastore object for the data. Then, we select specific +variables' names from the dataset. The selected variables' names feature permits +working with the specified variables of the user's needs. The user can use preview +command to retrieve the data. +B. Generic Map Function +Figure 5 shows the generic map function, which is considered as a general function for +any key and value. This function enables the coder to set any pair of key-value for the +selected dataset. We set intermediate key and intermediate value. Then, we subset the +dataset at this specific value. Finally, we obtain set of key-value stored in the keyvalue +store. +Insert large dataset +Initialize datastore variable to +store large dataset. +Select specific variables' names +from the dataset. +Add selected variables to +datastore. +Preview large dataset. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +7 +Figure 5. The block diagram of generic map function. +C. Map Function +Data Key-value +store +Subset +term +Generic map function +Initialize intermediate key and intermediate +value +Subset data at specific value +Set intermediate key-value store +Adding set of intermediate keys and +intermediate values to intermediate keyvalue +store. +Data Intermediate +key-value +store +Map function receives data and specific value +Set the condition of key-value pair +Create output store to store all partitions of data that +satisfy the key-value condition. +Store all the results in output key-value store. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +8 +Figure 6. The block diagram of map function. +Figure 6 illustrates the Map function that gets a table with the variables labeled by +the selected variables' names property in the data store. Then, the Map function +extracts a subset of the dataset that verifies the condition value of the selected key. +D. Reduce Function +Figure7 shows the Reduce function that receives the subsetted results gained from +the Map function and simply merge them into a single table. The Reduce returns one +key and one value. +Figure7. The block diagram of reduce function. +2.2 DBSCAN ALGORITHM +DBSCAN [5] is a clustering technique that depends on density. The thought is that if a +specific point fits in with a cluster, it ought to be close to loads of different points in +that cluster. The DBSCAN algorithm works as follows. First, two parameters are +picked, a positive number Epsilon and a characteristic number minPoints. Then, start +by picking a subjective point in the dataset. If there are more than minPoints points +inside of a separation of Epsilon starting there, we consider every one of them to be a +piece of a "cluster." Then, we extend that cluster by checking the greater part of the +new points and checking whether they too have more than minPoints points inside of a +Intermediate +value +Key-value +store +Create Reduce function +Initialize output value variable. +Get all intermediate results +While has next results, add intermediate values to the output value. +Adding all output values to output key-value store. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +9 +separation of epsilon. In the end, points are come out to be added to the cluster. After +that, pick a new arbitrary point and repeat the process. Presently, it is entirely probable +that the picked point is less than minPoints points in its Epsilon, and it is not a part of +any other group. Therefore, it is viewed as a "noise point" that is not fitting in any +group. The DBSCAN pseudo code is listed as follows: +DBSCAN steps are as follows: +1. Design a graph whose items are the points to be clustered +2. For each core-point c make an edge from c to every point p in the - +neighborhood of c +3. Set N to the items of the graph; +4. If N does not include any core points terminate +5. Pick a core point c in N +6. Let X be the set of nodes that can be reached from c by going forward; +1. create a cluster containing X{c} +2. N=N/(X{c}) +7. Continue with step 4 +2.3 FCM ALGORITHM +FCM [6,7] is a data clustering procedure. The dataset is categorized to n clusters. +Every data point in the dataset related to a cluster, which has a high level of +relationship with that cluster. Another data point that remotely lies from the center of a +cluster has a low level of association with that cluster. This technique is often utilized +in pattern recognition. It depends on minimization of the objective function. The +algorithmic steps for Fuzzy C-Means clustering is as follows: +First, calculate the center of the clusters using the following equation [6]: +Cj = ΣN +i=1 (Mm +ij * xi )/ Mm ij (1) +Then, the objective function is calculated based on the membership matrix by the +following calculation: +Jm=ΣN +i=1 ΣC +j=1 Mm +ij ||xi – cj ||2 (2) +Finally, the membership value is updated by: +M ij= 1/(Σ(||xi – cj|| / || xi - ck||))2/(m-1) (3) +where m is a real number greater than 1, Mij is the degree of membership of xi in the +cluster j, xi is the ith of d-dimensional measured data, cj is the d-dimension center of the +cluster, and ||*|| is the similarity measure between any measured data and the center. +FCM sequentially moves the cluster centers to the right area inside a dataset. FCM +clustering strategies rely on fuzzy behavior, and they give a method that is normal to +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +10 +produce a clustering where membership weights have a characteristic translation but +not probabilistic at all. +2.4 K- NEAREST NEIGHBORS (KNN) +In KNN regression, the outcome is the estimation of the item. This value is normal of +the estimations of its k-closest neighbors. Hence testing the performance should be +appropriate. The KNN computes the Euclidean distance from the query example to the +labeled examples using the following equation [8]. +D=√ (4) +Selecting the ideal value for K is best done by first reviewing the data. A large K value +is more accurate as it reduces the overall noise. Then, labeled examples are ordered by +the highest distance and find a heuristically top K-number of adjacent neighbors. +Finally, search the data for the most likely instance. It does not lose any detail and +compares every training sample to give the prediction. +2.5 SINGULAR VALUE DECOMPOSITION +SVD receives a rectangular matrix of the data that are defined as A, where A is an n x +p matrix, which the n rows represents the data and the p columns represent the +experimental properties. The SVD theorem states that [9]: +Anxp= Unxn Snxp VT +pxp (5) +Where +UTU = Inxn (6) +VTV = Ipxp (i.e. U and V are orthogonal) (7) +where U has columns that are the left singular vectors, S is the same dimensions as A +that contains singular values, and VT has rows that are the right singular vectors. The +SVD represents an outline of the original data in a coordinate system where the matrix +is diagonal. The SVD calculated by the equation: +W = AAT (8) +Wx=ƛx (9) +The scalar  is called an eigenvalue of A, and x is an eigenvector of A relating to . +The computation of the SVD consists of finding the eigenvalues and eigenvectors of +AAT or ATA. The eigenvectors of ATA consist the columns of V, the eigenvectors of +AAT represent the columns of U. Also, the singular values in S are square roots of +eigenvalues from AAT or ATA. The singular values are the diagonal entries of the S +matrix and are arranged in descending order. The singular values are always real +numbers. If the matrix A is a real matrix, then U and V are also real. The SVD feature +specifies the nearest rank-l estimation for a matrix. By putting the little singular values +to zero, we can acquire matrix estimations whose rank meets the number of +outstanding singular values. +3. RELATED WORK +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +11 +Big data from IoT is considered as an important research topic. Many researchers are +working in this field. For example, Tao and Ji [10] utilized the MapReduce technique to +investigate the various little datasets. They proposed procedure for monstrous little data +in light of the K-means clustering calculation. Their outcomes established that the +suggested manner may enhance the information preparing proficiency. They use Kmeans +calculation for data examination in view of MapReduce. Then, they utilized a +record for the converging of data inside the cluster. The data in the same square have a +high likeness when the merger is finished. The exploration will help them to plan a +merger technique of little information in IoT. The DBSCAN algorithm can be suitable +to be applied on big data because the number of clusters is not needed to be known in +the beginning. +Xu and Xun [11] outlined MapReduce model of distributed computing. In the +instrument of MapReduce, they consolidated the structural planning attributes and key +innovation of IoT. They led conveyed mining on information and data in the IoT world. +Also, they represent stream information distribution. In a customary way for mining +valuable information from raw data created by IoT, analyze deficiencies of the +conventional Apriori calculation. Apriori has a lower mining proficiency and consumes +up mass room in memory. The mining technique for monstrous information in the IoT +involves stream information investigation, grouping and so on. They plan to propose a +system for handling Big data with a low charge and apply security of information. The +proposed system has a low effectiveness, so it should be moved forward. +Wang et al. [12] investigated structural planning of the IoT in agribusiness that gives +distributed processing and its usage. The execution planned on a two-tier construction +using HBase. The structural planning gives constant read or access to the enormous +sensor information. In addition, backing the sensor data executed by MapReduce +model. XML documents put standards for the framework to bind the organizations of +heterogeneous sensor data. Utilizing this framework lead the framework to lack of a +variety of sensor data. +Gole and Tidk [13] proposed a ClustBigFIM method, which is based on MapReduce +structure for mining large datasets. ClustBigFIM is an improvement of BigFIM +algorithm that is offering velocity to obtain information from massive datasets. They +are relying on the manner of associations, sequential patterns, correlations, and other +data mining missions that give good vision. MapReduce stage is utilized widely for +mining big data from online networking as convention device and systems. It aims to +employ frequent item to set mining calculation and MapReduce system on a flow of +information. It can be consistent experiences in Big data. +Li et al. [1] suggested a storage managing clarification relied on NoSQL, which is +called IOTMDB. They offered a storing managing clarification to handle the massive +and heterogeneous IoT data. The IOTMDB is not only mattered about how to save the +massive IoT data successfully but also to concern for data distribution. The IoT data +storing tactics are applied to incorporate a preprocessing procedure to cover the public +and precise requirements. Their future work will be a model oriented to IOTMDB that +will rely on NoSQL. In addition, they will handle and investigate the massive IoT data +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +12 +to expand its value. Applying a reduction algorithm in the preprocessing step will +improve the accuracy and save time. +Mesiti and Valtolina [14] proposed a structure that was ready to assemble information +from distinctive sources with diverse structures like JSON, XML, literary, and +information gushing from sensors. The information accumulations led the database to +be unstructured and oblige information joining. As the world moves to grow Big +information investigation strategies, they came to an answer that can be loading +information from heterogeneous sensors then incorporate that heterogeneous sensor +information utilizing NoSQL frameworks. They outlined an easy to use loading +framework by deciding an arrangement to choose fitting NoSQL framework that +permits reasonable mapping to be conveyed. +Zhan et al. [15] designed a massive data processing model in the cloud. Their model +can be used to handle all types of data resources, which can be structured, semistructured, +and non-structured. They concentrated on two main points. First, they +outlined the CloudFS that depends on the open sources project Hadoop. Second, they +implemented Cloud Manager DB that is constructed on the open sources project HBase, +MongoDB. Finally, they did not provide any method to deal with the varieties of the +data. +Galache et al. [16] displayed the ClouT extend, which is a joint European-Japanese +venture. Their main issue is making nations mindful of city resources. In addition, they +talk care of these resources by a set of smart IoT services in the Cloud. The proposed +framework based on a three-layer architecture, which is composed of CIaaS, CPaaS, +and CSaaS layers. They developed different four use cases associated with different +applications within four cities. These assets utilized and considered by effective IoT +benefits in the Cloud. +Sowe et al. [17] proposed an answer for massive heterogeneous sensor information +issue. They obliged to make a join between distinctive types of information. This issue +is an incorporated IoT structural planning. It consolidates a Service-Controlled +Networking (SCN) as a key middleware to oversee heterogeneous information +accumulated from sensors on a Big data cloud stage. The proposed model is connected +to accumulate, share information, and control IoT social orders. It allows the client to +investigate, find, and use the sensor information. They utilized the User Defined +Harvester (UDH) advancements notwithstanding SCN to expand the included detection. +In this paper, the portable detecting information is not accessible. They ought to execute +the structure that can treat with this detection information. +Cecchinel et al. [18] proposed a programming structure that ready to support big data +examination work. This structure is the utilization measure of datasets that originate +from physical sensors. These datasets originate from SMARTCAMPUS venture. Their +structural engineering can understand genuine prerequisites from the +SMARTCAMPUS venture. As a result, the work done in this structural planning relies +on information from social event and capacity, i.e. the discriminating way of Big data +accumulation stage by utilizing middleware structural engineering. They plan to create +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +13 +a programming model that empowers every client to make its applications. On the off +chance that they include new information, the system programming can be down. +Therefore, the system adaptability ought to be improved. +Mishra et al. [19] proposed a Cognitive-Oriented IoT Big-data framework (COIB) for +the valuable data administration and knowledge detection over the IoT Big data. They +built a general IoT Big data layered design by the usage of the COIB system in the huge +scale mechanical computerization environment. They suggested in their future work to +incorporate mining and examination huge information that is produced by trillions of +IoT items +In this paper, our proposed system offers a solution for storing and retrieving IoT +Big data and improves the accuracy of the resulting data. The proposed system can +store and retrieve a massive number of data in small time. First, we clean noise from +data. Then, we use Kennard sample and SVD as a data reduction techniques to reduce +big data from IoT without losing any data. Also, we use the mutual information +algorithm to detect relationships between attributes and predict the semantic clusters. +Finally, we use MapReduce based on FCM-DBSCAN for data clustering for the vast +store and retrieve of data. +4. THE PROPOSED SYSTEM +Figure 8. The proposed system of the massive–heterogeneous sensor data. +Variety of sensors +Raw data +Data Cleaning +Data Integration +Data Processing (clustering) +Storage +Data Reduction +Storage +Homogenous +data +Dimensional +reduced data +Data with little +size +Cleaned, +noiseless data +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +14 +The proposed system consists of two main phases: data preprocessing and data +processing phases, as shown in figure 8 In the preprocessing phase, the first stage is +data collection stage. In this stage, the dataset collected from different sensors. The +second stage is data cleaning based on outlier detection and noise removal as it is easy +to implement. The third stage is data reduction using SVD algorithm to reduce the +dimensionality of the data and reduce the execution time of data processing then +utilization of Kennard sampling to select a random sample from dataset aiming to save +the running time. The last stage is data integration based on correlation and mutual +information aiming to determine the relationship between attributes and detect semantic +clusters. In the processing phase, data is clustered using FCM-DBSCAN based on +MapReduce as it is a standard programming model for data distribution to improve the +performance of big data in a vast time. In the following subsections, the main stages of +these two phases will be discussed in details. +a. Data Preprocessing Phase: +The preprocessing is a basic phase in data science because it qualifies the choices to be +originated from the qualified data. Data preprocessing is a data mining method that +includes changing raw data into a reasonable information. Genuine information is +frequently inadequate, conflicting, leaking in specific practices, and liable to include +numerous mistakes. Data preprocessing is a demonstrated strategy for determining such +issues. It utilizes database-driven applications, such as associations and standard +established applications [20]. The applied data preprocessing steps are data cleaning, +data reduction, and data integration. These steps are discussed in detail in the +following subsections. +a) Data Cleaning: +The procedure of cleaning the data is not easy. The confusion may reach to more +than 30% of real information that could be grimy. In addition, it has exceptionally cost +[21]. Data can be cleaned based on procedures, such as filling in missing values, +smoothing the noisy data, or solving the inconsistencies in the data. Several ways have +been used to deal with missing data, such as [22]: + Deletion: It removes the missing data and using the rest of the data in the +analysis. This deletion can be inefficient as it decreases dataset size and may +delete valuable data. + Imputation: It tries to fill in the missing values with the help of many techniques, +such as: +o Mean/Mode: It fills the missing data by using the mean of a numeric +attribute or mode for a nominal attribute of all data. +o K-Nearest Neighbor Imputation (KNN): It uses KNN algorithms to fill +the missing data. It can deal with discrete and continuous attributes. KNN +searches all the data to find the most similar instances. It can choose the +most probable value from the dataset. +We suggest KNN algorithm for data cleaning. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +15 +Figure 9. The block diagram of the data cleaning steps. +Figure 9 shows that the input data has many challenges as noisy data and outliers. +First, the data is de-duplicated to remove the repetition of the data. Then, the outlier is +detected and excluded from data. The data is filtered to choose the principle attributes +to represent data. Finally, missing values are replaced by the most probable value +depending on KNN regression. +b) Data Reduction +A monstrous measure of information is progressively available from different +sources, for example, logistics insights, cameras, receivers, RFIDs, scanner tag +information, remote sensor systems, and account logs from R&D [23]. Highdimensional +information gets extraordinary difficulties terms of computational manysided +quality and characterization execution. Along these lines, it is important to +obtain a low-dimensional component space from high dimensional component space to +outline a learner with great execution [24]. +Figure 10. The block diagram for the data reduction steps. +Figure 10 shows that the cleaned data is the input for data reduction stage. Data +reduction separated to numericity reduction and dimensionality reduction. The data +numericity reduction can be applied using regression or sampling. The used sampling +algorithm is Kennard sample. Kennard sample reduces the number of iterations by +viewing a list of the highest smallest distances that aims to save time. The data +dimensionality reduction can be applied using many algorithms as PCA, SOM, and +SVD algorithm. We proposed to use SVD for dimensionality reduction. It is suitable +for reducing the dimensionality of large dimensional data. We compare SVD +Input data De-duplication Detect outlier +Replace missing values Filtering +Input data +(Cleaned and Noiseless data) +Numericity Reduction +Dimensionality Reduction +Sampling +Singular Value Decomposition +Reduced data +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +16 +algorithm with other algorithms as PCA, SOM, ICA, PCA (Kernel). We conclude that +the SVD algorithm operates in small time than other algorithms. +c) Data Integration +Data with diverse forms are put together and opposes with each other. Data integration +is a successful way to deal with combined data that lives in various sources and gives +brought together for the purpose of access to the end users [25]. Big data presents +organizations with huge volume and multifaceted nature. It comes in diverse +structures–organized, semi-organized, and unorganized– and from any number of +different sources. From this immense, various sorts of information are continuously +developed. Therefore, the organizations should concentrate on speedy, exact, and +significant bits of knowledge [26]. +The proposed algorithm is the mutual information that can able to deal with numeric +data. Mutual information detects the relationship between the attributes and also +detects the semantic clusters. The equation of the mutual information is as follows +[27]: +MI=Σx,y P(X,Y)log2[P(X,Y)/P(X)P(Y)] (10) +where X and Y are the two dimensions of the dataset. +b. Data Processing Phase +Data processing phase is the control of the information processing. Information +preparation refers to the handling of the information that is needed to run associations +[28]. Massive data from IoT require processing for data storing. Huge IoT information +is the high inspecting recurrence, this result in a tremendous measure of repeating or +amazingly comparative qualities. We suggest MapReduce based on a hybrid of FCM +and DBSCAN as a clustering algorithm to overcome the massive data storing problem. +MapReduce is considered as the most suitable technique to apply massive data +processing. +In FCM-DBSCAN Map function, first, we initialize minimum points that represent +minimum value of points in each cluster, epsilon value that represent the distance +between center and point, and membership matrix. Then, we calculate the centers of +clusters using equation +for each point in the dataset, the distance between +points and center of the cluster is calculated using equation d=ΣN +i=1 ΣC +j=1 Mm +ij ||xi – cj +||2. If the distance between point and center of cluster equal or greater than epsilon +value, this point marked as neighborPts to this cluster. Then, the neighbors points for +each center are calculated depending on epsilon value. If neighbor points for any +cluster are less than minimum points, then mark point as a noise else, the point marked +as clustered. We determine the key and create a new cluster. It repeats until reach to +convergence state. Finally, emit each point and each belonging cluster. + FCM-DBSCAN Map Function +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +17 +FCM-DBSCAN Map function +FCM-DBSCAN(D, eps, MinPts, M) +Initialize a number of clusters. +For each point P in dataset D +if P is visited +continue next point +mark P as visited +Calculate the center of clusters by equation +Calculate distance using equation d=ΣN +i=1 ΣC +j=1 Mm +ij ||xi – cj ||2. +For each p in D +Calculate neighborPts for each c based on eps +If d<= eps mark p as neighborPt +if sizeof(NeighborPts) < MinPts +mark P as NOISE +else Prepare the key and create new cluster C. +C = next cluster +expandCluster(P, C) +C.neighborPoints = NeighborPts +For each c +Calculate the new value of membership by equation M ij= 1/(Σ(||xi – cj|| / ||xi - ck||))2/(m-1) +Calculate the center of clusters by equation +if new center=old center then Break +End for +Emit(key, c) +End for +End for +End function + FCM-DBSCAN Reduce Function +FCM-DBSCAN Reduce function +FCM-DBSCAN Reduce function (key, c, eps, MinPts) +For all C clusters do +Set finalC.Points equal finalC.points ∪ C.points +For all P in C.neighborPoints do +if P′ is not visited +mark P′ as visited +Calculate NeighborPts′ for each P′ based on eps +If size of NeighborPts′ >= MinPts +set NeighborPts equal NeighborPts ∪ NeighborPts′ +End if +If P′ is not yet a member of any cluster +add P′ to cluster C +End if +End for +End for +Output: Set of clusters of data. +In FCM-DBSCAN Reduce function, the inputs are minimum points, epsilon value, +clusters, and keys. For each C cluster, the final cluster points equal to previous cluster +points in addition to the current cluster points. For all points in the cluster if a point +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +18 +marked as unvisited, then this point is marked as visited. The neighbor points are +calculated and compared with minimum points. If neighbor points are greater or equal +to a minimum point, then neighbor points are equal to neighbor points and cluster +points. Finally, the output is a set of a cluster of data. +As shown in figure 8, raw data is collected from different sensors, which results in +many problems, such as noisy, heterogeneous and massive data. Our proposed work +aim to solve these problems that face sensor data. The raw data is collected from +different sensors and stored. Then we applied preprocessing on this data. Then this +data is cleaned from noise by regression using KNN. We suggest KNN for dealing +with noisy data as it is very simple and can detect the most probable value than another +technique. Then, the cleared data reduced using SVD algorithm. It is very suitable for +reducing the high-dimensional data and for validating significant vision of data. +Therefore, data is sampled using Kennard sample. When applying the sampling, it +speeds the running time. We integrate the data come from heterogeneous sources +based on correlation, covariance matrices using mutual information matrix to detect +the relationship between elements in the dataset and predict semantic clusters. +In the data processing step, the proposed model is the MapReduce model based on +FCM-DBSCAN clustering technique. It is an intensity established clustering +algorithm, which gives an arrangement of entities in some space. It can discover the +clusters of diverse forms and sizes from a huge quantity of data without detecting +some clusters in the beginning. +5. THE EXPERIMENTAL RESULTS AND DISCUSSION +5.1 DATASET DESCRIPTION +The dataset includes ordinary IADL housekeeping activities [29]. These activities are +vacuuming, ironing, dusting, brooming, mopping, cleaning windows, making the bed, +watering plants, washing dishes, and setting the table. The general interval of the +dataset is 240 minutes. The intervals differ amongst some of the activities, indicating +the usual spreading of activities in daily life. They used the Porcupine sensor together +with the iBracelet to record both acceleration and RFID tag detections. The dataset +consists of the estimation of 1048576 records. We implement the proposed technique +on the dataset using Radoop, KNIME, and Matlab 2015b on Core(TM) 2 Due, 2 GH +processor, and 3 GB RAM. +5.2 RESULTS VIEW +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +19 +Figure 11. A part of the used dataset. +Figure 11 shows a part of the used dataset. The act represents activity label results +from ironing, vacuuming, brooming, making the bed, mopping, window cleaning, +watering plant, dish washing, and setting the table. Acc represent 3D Accelerator [x, y, +z] represented in Acc1, Acc2, Acc3, Lgt represent light, Tlt represent nine tilt data, Btn +represent annotation buttons, Rtc represent real time clock [ddmmyyhhmmss], and +Time represents elapsed number of seconds from the beginning of the recording. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +20 +Figure 12. The outlier detection. +Figure 12 shows the outlier detection. A new field called outlier appears. In the state of +finding an outlier, the value of this field is true otherwise the value is false. The outlier +is true when an observation is well outside of the expected scope of values in an +experiment. An outlier arises from variability in the measurement or experimental +error indication. The outliers are excluded from the dataset. +Figure 13. The outlier excluding and replacing the missing values. +Figure 13 shows that the outlier property has the values false for all the tuples, and the +missing values are replaced by the most probable value depending on KNN regression. +Figure14. The SVD deployment. +Figure 14 shows the applying of SVD algorithm that results in the reduction of the +dataset. The data represented using a smaller number of properties. The attribute with +high singular value has the priority to be presented. SVD1 has the highest probability +to present the data. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +21 +Figure 15. The mutual information matrix. +Figure 15 shows the outcome matrix from mutual information. A measure of the +variables mutual dependence is the trans-information of two variables. The mutual +information represents the rate of association or correlation between the row and +column variables. The mutual information partitioned data by 2N where N is the +sample size. The mutual information between items is used as a feature for clustering +to discover semantic clusters. When the value of mutual information is large, it +represents a high relationship between attributes. +5.3 RESULT VIEW OF MAPREDUCE PROCESSING. +Figure 16. The resulting attributes from Read dataset code. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +22 +Figure 17. The MapReduce function execution and read the resulted data after +MapReduce implementation. +Figure 16 shows the read data from MapReduce that observes a set of resulted +attributes view from IADL dataset after data preprocessing phase. Figure 17 shows the +MapReduce implementation. The dataset begins with no Map and no Reduce (Map is +0%, and Reduce is 0%) until Map becomes 100% and Reduce becomes 100%. Then, +we read the data result from MapReduce implementation. +5.4 EVALUATION +The evaluation observes the time and accuracy of preprocessing of the dataset. As +shown in Tables 2 and 3, the precision value is 99.3%, sensitivity value is 99.53%, and +the value of specificity is 85.52%. From the previous results and evaluation, we +conclude that the reduction step and FCM-DBSCAN enhanced the accuracy of the Big +data to be 98.9%. +Accuracy = +(11) +Precision = +(12) +Sensitivity (TP rate) = +(13) +Specificity (TN rate) = +(14) +TP True Positives: positive tuples correctly labeled +FP False Positives: negative tuples incorrectly labeled +TN True Negatives: negative tuples correctly labeled +FN False Negatives: positive tuples incorrectly labeled +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +23 +Table 1: The comparison between KM, Optics, EM, DBSCAN, and our proposed +system FCM-DBSCAN based on MapReduce model. +PCA PCA(Kernel) ICA SOM SVD +Time +(Sec.) +Accuracy +(%) +Time +(Sec.) +Accuracy +(%) +Time +(Sec.) +Accuracy +(%) +Time +(Sec.) +Accuracy +(%) +Time +(Sec.) +Accuracy +(%) +Performance +measure +k-Means 92 0.2 0.89 2 87 0.2 92.15 0.1 94.73 0.2 +0.79 +Optics 90.2 1.9 91 9.68 65.48 0.6 91.05 1.9 90 +EM 65.82 13 75.28 2.17 94.4 2.54 66.64 8 95.21 2 +DBSCAN 93.4 0.3 89.3 7.3 90.12 0.4 88.46 1 98 3.11 +FCM- 94.5 0.25 91.6 5.2 97.48 0.5 93.5 2.3 98.9 1.5 +DBSCAN +Table 1shows the comparison between different clustering algorithms as K-Means, +Optics, EM, DBSCAN, and the proposed approach FCM-DBSCAN. The clustering +algorithms are tested with different data reduction algorithms, such as PCA, +PCA(Kernel), ICA, SOM, and SVD. +In table 2 and table 3 we divided the dataset to training data and testing data, then we +evaluate the proposed approach on the tested data. +Table 2: The Positive and Negative matrix for the proposed system. +Predicted True False +Actual +Yes 9500 44 +No 66 390 +Table 3: The performance measure of our proposed system. +Recall 99.53% +Precision 99.3% +Sensitivity 99.53% +Specificity 85.52% +Accuracy 98.9% +F-measure 99.39% +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +24 +Time in +seconds +Clustering Techniques +Figure 18. The expended time comparison between different clustering technique +based on different reduction algorithms based on MapReduce model. +From our comparative studies that done in Table 1 and figure 18, we found that FCMDBSCAN +with its varied approaches for data reduction had the high accuracy value. +FCM-DBSCAN with SVD have the highest value of accuracy and retrieve data in a +small time. +K-Means and optics have nearest accuracy value, but optics has longer time. The EM +algorithm takes larger time than other techniques. The DBSCAN has high accuracy but +takes longer time. In FCM-DBSCAN, the accuracy increased and the expected time +decreased. +6.CONCLUSION +A massive amount of IoT data has been generated due to the vast increasing of +existing devices, sensors, actuators, and network communications. The resulting +massive IoT data is called "Big data." Big data refers to a massive data, which takes +much time to be processed. Therefore, we focused on clustering methodology rely on +MapReduce model to store data and recover results in a close real-time. We offer a +framework for processing massive and heterogeneous data in IoT. +This paper illustrated the Big data from IoT from many viewpoints. The raw dataset is +collected from different sensors, which leads to many problems, such as noisy, +heterogeneous, and massive data. Our proposed system aims to solve these problems +that face sensor data. The architecture of the proposed system consists of two main +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +K-Means Optics EM DBSCAN FCM-DBSCAN +PCA +PCA kernel +ICA +SOM +SVD +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +25 +stages: data preprocessing and data processing phases. In the preprocessing phase, we +used KNN to clean noisy data and replace missing data, which can use the most +probable value. The SVD is used to reduce data to save time. The mutual information +is implemented to detect the relationship between the data and detect semantic +clustering to achieve high accuracy and speed the running time. The MapReduce +model based on FCM-DBSCAN achieves data clustering by Map and Reduce +functions in a small time that resulted from using reduction technique before data +clustering. The processing time of the proposed system is 1.5 seconds, and the +accuracy is 98.9%. +In future work, we will implement the processing on different datasets and apply +different techniques using spark model that aims to speed the running time. Moreover, +we will implement data query processing using the best and suitable model of NoSQL +database. We suggest Key-value database. The Key-value (KV) stores use the +associative array, which is called a map. This approach can efficiently retrieve +selective key ranges. Also, we will address the challenges and deeply develop the big +data processing in cloud computing environments. +7. REFERENCES +[1] Li, T., Liu, Y., Tian, Y., Shen,S., & Mao, W. (2012). A storage solution for +massive IoT data based on NoSQL. IEEE International Conference on Green +Computing and Communications (GreenCom), Besancon, 50-57. +[2] Tsai, C., Lai, C., Chiang, M., & Yang, L. (2014). Data Mining for Internet of +Things: A Survey. IEEE Communications Surveys & Tutorials, 16(1), 77-97. +[3] Sharma, S. & Mangat, V. (2015). Technology and trends to handle big data: a +survey. 5th IEEE International Conference on Advanced Computing & +Communication Technologies (ACCT), Haryana, 266-271. +[4] Martha, V. S., Zhao, W., & Xu, X. (2013). h-MapReduce: a framework for +workload balancing in MapReduce. 27th IEEE International Conference on +Advanced Information Networking and Applications, 637-644. +[5] Dharni, C. & Bnasal, M. (2013). An Improvement of DBSCAN Algorithm to +Analyze Cluster for Large Datasets. IEEE International Conference on MOOC, +Innovation and Technology in Education (MITE), 42-46. +[6] Ghosh, S. & Kumar, S. (2013). Comparative Analysis of K-Means and Fuzzy CMeans +Algorithms. International Journal Of Advanced Computer Science And +Applications, 4(4), 35-39. +[7] Bora, D. & Gupta, D. (2014). A Comparative study Between Fuzzy Clustering +Algorithm and Hard Clustering Algorithm. International Journal Of Computer +Trends And Technology, 10(2), 108-113. +[8] Han, J., Kamber, M., & Pei, J. (2012). Data Mining Concepts and Techniques. +Third Edition, Elsevier, Chapter 9, 422- 425. +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +26 +[9] Singular Value Decomposition (SVD) tutorial. (2016). Web.mit.edu. Retrieved 7 +Jan 2016, from +http://web.mit.edu/be.400/www/SVD/Singular_Value_Decomposition.htm +[10] Tao, X. & Ji, C. (2014). Clustering massive small data for IOT. 2nd +International Conference on Systems and Informatics( ICSAI), Shanghai, 974- +978. +[11] Liancheng, X. & Jiao, X. (2014). Research on distributed data stream mining in +Internet of Things. International Conference On Logistics Engineering +Management And Computer Science (LEMCS), Atlantis Press, 149- 154. +[12] Wang, H., Lin, G., Wang, J., Gao, W., Chen, Y., & Duan, Q. (2014). +Management of Big Data in the Internet of Things in Agriculture Based on Cloud +Computing. AMM, 548-549, 1438-1444. +[13] Gole, S. & Tidke,B. (2015). Frequent itemset mining for big data in social media +using ClustBigFIM algorithm. IEEE International Conference on Pervasive +Computing (ICPC), Pune, 1-6. +[14] Mesiti, M.& Valtolina, S. (2014). Towards a user-friendly loading system for +the analysis of big data in The Internet Of Things. 38Th IEEE Annual +International Computers, Software, And Applications Conference Workshops +(COMPSACW), Vasteras, 312- 317. +[15] Zhang, G., Li,C., Zhang, Y., Xing, C., & Yang, J. (2012). An efficient massive +data processing model in the Cloud- A preliminary report. 7th ChinaGrid Annual +Conference, Beijing, 148-155. +[16] Galache, J., Yonezawa, T., Gurgen, L., Pavia, D., Grella, M., & Maeomichi, H. +(2014). ClouT: leveraging cloud computing techniques for improving +management of massive IoT data. 7th IEEE International Conference on Service- +Oriented Computing and Applications(SOCA), Matsue, 24-327. +[17] Sowe, S., Kimata, T., Dong, M., & Zettsu, K. (2014). Managing heterogeneous +sensor data on a big data platform: IoT services for data-intensive science. 38Th +IEEE Annual International Computers, Software, And Applications Conference +Workshops, Vasteras, 259-300. +[18] Cecchinel, C., Jimenez, M., Mosser, S., & Riveill, M. (2014). An architecture to +support the collection of big data in The Internet Of Things. 10Th IEEE World +Congress On Services, Anchorage, AK, 442-449. +[19] Mishra, N., Lin, C., & Chang, H. (2014). A cognitive-oriented framework for +IoT big-data management prospective. IEEE International Conference +Communication Problem-Solving (ICCP), Beijing, 124-127. +[20] What is Data Preprocessing? - Definition from Techopedia. (2015). Techopedia. +com. Retrieved 9 July 2015, from +http://www.techopedia.com/definition/14650/data-preprocessing +ISSN:0254-0223 Vol. 31 (n. 7, 2016) +27 +[21] Tang, N. (2015). Big RDF data cleaning. 31st IEEE International Conference +on Data Engineering Workshops (ICDEW), Seoul, 77-79 . +[22] Shoaip, N., Elmogy, M., Riad, A., & Badria, F. (2015). Missing Data Treatment +Using Interval-valued Fuzzy Rough Sets with SVM. International Journal of +Advancements in Computing Technology(IJACT), 7(5), 37-48. +[23] Sadeghzadeh, K. & Fard, N. (2015). Nonparametric data reduction approach for +large-scale survival data analysis. IEEE Reliability and Maintainability +Symposium (RAMS), Palm Harbor, 1 – 6. +[24] Katole, S. & Karmore, S. (2015). A new approach of microarray data dimension +reduction for medical applications. 2nd IEEE International Conference on +Electronics and Communication Systems (ICECS), Coimbatore, 409-413. +[25] Saranya, K., Hema, M., & Chandramathi, S. (2014). Data fusion in ontology +based data integration. IEEE International Conference on Information +Communication and Embedded Systems (ICICES), Chennai, Tamil Nadu, India, +1-6. +[26] Pal, K. (2015). How to Address Common Big Data Pain Points. Data Informed. +Retrieved 8 July 2015, from http://data-informed.com/how-to-address-commonbig- +data-pain-points +[27] Cover, T. & Thomas, J. (2012). Elements of information theory. Second Edition, +John Wiley & Sons, Chapter 2, 19-22 . +[28] Encyclopedia Britannica: data processing | computer science. (2015). +Encyclopedia Britannica. Retrieved 7 July 2015, from +http://www.britannica.com/technology/data-processing +[29] ADL Recognition Based on the Combination of RFID and Accelerometer +Sensing | Embedded Sensing Systems - www.ess.tu-darmstadt.de. (2015). Ess.tudarmstadt. +de. Retrieved 17 August 2015, from http://www.ess.tudarmstadt. +de/datasets/PHealth08-ADL +View publication stats \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..0a536999d8e50ea8d27a89590e46ce5681b6b4b0 GIT binary patch literal 126464 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

?J7FYv$ZbP^i%=#ulYE=A)2bhe8d^Bt|aOBqtYY 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 W=tsj*wb1L+50MnG@_M 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 pair&依赖 +MapReduce job&work&依赖 +unit&work&AGGREGATION +MapReduce job&job&GENERALIZATION +MapReduce job&input datum&依赖 +MapReduce job&MapReduce program&依赖 +Hadoop&MapReduce job&依赖 +two type&task&AGGREGATION +Hadoop YARN&task&依赖 +Hadoop YARN&YARN&GENERALIZATION +they&unfavorable condition&依赖 +user&map function&依赖 +map function&function&GENERALIZATION +function&map task&AGGREGATION +output&map task&AGGREGATION +output&reduce task&依赖 +output&reduce task&依赖 +map task&task&GENERALIZATION +Reduce task&map task&依赖 +Reduce task&output&依赖 +Reduce task&aggregation&依赖 +MapReduce task&two phase&依赖 +MapReduce task&task&GENERALIZATION +Hadoop&input&依赖 +Hadoop&input&依赖 +Hadoop&fixed-size split&依赖 +RecordReader&record&依赖 +it&records itself&依赖 +RecordReader&split&依赖 +one map task&a user-defined function call map function&依赖 +Hadoop&map phase&依赖 +one map task&input split&依赖 +Hadoop&one map task&依赖 +input split&split&GENERALIZATION +one map task&record&依赖 +It&zero or multiple intermediate key-value pair&依赖 +It&map task output&依赖 +map task&output&依赖 +map task&local disk&依赖 +its&output& +Hadoop&combiner function&依赖 +combiner function&function&GENERALIZATION +Hadoop&user&依赖 +combiner group&map phase&依赖 +combiner group&datum&依赖 +combiner group&map phase&依赖 +combiner group&datum&依赖 +output&map function&AGGREGATION +It&map function&依赖 +It&output&依赖 +their&output& +map task partition&output&依赖 +their&values& +Hadoop&user&依赖 +Hadoop&partitioning&依赖 +Reducer task&a shuffle and sort step&依赖 +Reducer task&task&GENERALIZATION +main purpose&phase&AGGREGATION +main purpose&equivalent key&依赖 +sort and shuffle phase download&datum&依赖 +It&data piece&依赖 +It&large data list&依赖 +MapReduce framework&sort&依赖 +we&it&依赖 +sort and shuffling&framework&依赖 +developer&control&依赖 +developer&control&依赖 +Reducer&key grouping&依赖 +it&zero or more key-value pair&依赖 +it&OutputFormat&依赖 +Hadoop HDFS&HDFS&GENERALIZATION +reduce task output&Hadoop HDFS&依赖 +It&reducer output&依赖 +reducer output&output&GENERALIZATION +it&default&依赖 +it&key&依赖 +YARN YARN&YARN&GENERALIZATION +YARN YARN&Resource Negotiator&依赖 +resource management layer&Hadoop&AGGREGATION +It&Hadoop 2&依赖 +YARN&separate daemon&依赖 +YARN&functionality&依赖 +YARN&job scheduling&依赖 +YARN&idea&依赖 +job scheduling&scheduling&GENERALIZATION +functionality&job scheduling&AGGREGATION +basic idea&global ResourceManager and application Master&依赖 +application&job&依赖 +single job or DAG&job&AGGREGATION +basic idea&application&依赖 +YARN&ResourceManager and NodeManager&依赖 +apache hadoop yarn 1&apache hadoop yarn 1&依赖 +It&resource&依赖 +It&cluster&依赖 +It&application&依赖 +It&two main component&依赖 +Scheduler&resource&依赖 +Scheduler&running&依赖 +Scheduler&capacities , queues , etc&依赖 +Scheduler&resource&依赖 +It&application&依赖 +It&status&依赖 +Scheduler&restart&依赖 +Scheduler&failed task&依赖 +restart&failed task&AGGREGATION +resource requirement&application&AGGREGATION +It&scheduling&依赖 +ApplicationManager&first container&依赖 +their&status& +It&status and progress&依赖 +It&machine resource usage&依赖 +It&nodemanager (&依赖 +we&article&依赖 +we&Hadoop Architecture&依赖 +Hadoop&master-slave topology&依赖 +architecture&three layer&依赖 +hdf&Hadoop&依赖 +Hadoop cluster&cluster&GENERALIZATION +hdf daemon namenode and yarn daemon resourcemanager&Hadoop cluster&依赖 +hdf daemon namenode and yarn daemon resourcemanager&master node&依赖 +hdf daemon datanode&hdf daemon datanode&依赖 +hdf daemon datanode&hdf daemon datanode&依赖 +hdf daemon datanode&slave node&依赖 +hdf daemon datanode&slave node&依赖 +hdf daemon datanode&slave node&依赖 +hdf daemon datanode&slave node&依赖 +hdf daemon datanode&hdf daemon datanode&依赖 +hdf daemon datanode&hdf daemon datanode&依赖 +hdf and mapreduce framework run&same set&依赖 +hdf and mapreduce framework run&same set&依赖 +hdf and mapreduce framework run&node&依赖 +same set&node&AGGREGATION +hdf and mapreduce framework run&same set&依赖 +hdf and mapreduce framework run&node&依赖 +hdf and mapreduce framework run&node&依赖 diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt" new file mode 100644 index 0000000..2cc9432 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt" @@ -0,0 +1,152 @@ +Apache Hadoop Architecture – HDFS, YARN & MapReduce +Explore the architecture of Hadoop, which is the most adopted framework for storing and processing massive data. + +In this article, we will study Hadoop Architecture. The article explains the Hadoop architecture and the components of Hadoop architecture that are HDFS, MapReduce, and YARN. In the article, we will explore the Hadoop architecture in detail, along with the Hadoop Architecture diagram. + +Let us now start with Hadoop Architecture. + +Hadoop Architecture +hadoop architecture + +The goal of designing Hadoop is to develop an inexpensive, reliable, and scalable framework that stores and analyzes the rising big data. + +Apache Hadoop is a software framework designed by Apache Software Foundation for storing and processing large datasets of varying sizes and formats. + +Hadoop follows the master-slave architecture for effectively storing and processing vast amounts of data. The master nodes assign tasks to the slave nodes. + +The slave nodes are responsible for storing the actual data and performing the actual computation/processing. The master nodes are responsible for storing the metadata and managing the resources across the cluster. + +Slave nodes store the actual business data, whereas the master stores the metadata. + +The Hadoop architecture comprises three layers. They are: + +Storage layer (HDFS) +Resource Management layer (YARN) +Processing layer (MapReduce) +hadoop component - hadoop architecture + +The HDFS, YARN, and MapReduce are the core components of the Hadoop Framework. + +Let us now study these three core components in detail. + +1. HDFS +HDFS Architecture + +HDFS is the Hadoop Distributed File System, which runs on inexpensive commodity hardware. It is the storage layer for Hadoop. The files in HDFS are broken into block-size chunks called data blocks. + +These blocks are then stored on the slave nodes in the cluster. The block size is 128 MB by default, which we can configure as per our requirements. + +Like Hadoop, HDFS also follows the master-slave architecture. It comprises two daemons- NameNode and DataNode. The NameNode is the master daemon that runs on the master node. The DataNodes are the slave daemon that runs on the slave nodes. + +NameNode +NameNode stores the filesystem metadata, that is, files names, information about blocks of a file, blocks locations, permissions, etc. It manages the Datanodes. + +DataNode +DataNodes are the slave nodes that store the actual business data. It serves the client read/write requests based on the NameNode instructions. + +DataNodes stores the blocks of the files, and NameNode stores the metadata like block locations, permission, etc. + +2. MapReduce +apache hadoop mapreduce + +It is the data processing layer of Hadoop. It is a software framework for writing applications that process vast amounts of data (terabytes to petabytes in range) in parallel on the cluster of commodity hardware. + +The MapReduce framework works on the pairs. + +The MapReduce job is the unit of work the client wants to perform. MapReduce job mainly consists of the input data, the MapReduce program, and the configuration information. Hadoop runs the MapReduce jobs by dividing them into two types of tasks that are map tasks and reduce tasks. The Hadoop YARN scheduled these tasks and are run on the nodes in the cluster. + +Due to some unfavorable conditions, if the tasks fail, they will automatically get rescheduled on a different node. + +The user defines the map function and the reduce function for performing the MapReduce job. + +The input to the map function and output from the reduce function is the key, value pair. + +The function of the map tasks is to load, parse, filter, and transform the data. The output of the map task is the input to the reduce task. Reduce task then performs grouping and aggregation on the output of the map task. + +The MapReduce task is done in two phases- + +1. Map phase +a. RecordReader + +Hadoop divides the inputs to the MapReduce job into the fixed-size splits called input splits or splits. The RecordReader transforms these splits into records and parses the data into records but it does not parse the records itself. RecordReader provides the data to the mapper function in key-value pairs. + +b. Map + +In the map phase, Hadoop creates one map task which runs a user-defined function called map function for each record in the input split. It generates zero or multiple intermediate key-value pairs as map task output. + +The map task writes its output to the local disk. This intermediate output is then processed by the reduce tasks which run a user-defined reduce function to produce the final output. Once the job gets completed, the map output is flushed out. + +c. Combiner + +Input to the single reduce task is the output from all the Mappers that is output from all map tasks. Hadoop allows the user to define a combiner function that runs on the map output. + +Combiner groups the data in the map phase before passing it to Reducer. It combines the output of the map function which is then passed as an input to the reduce function. + +d. Partitioner + +When there are multiple reducers then the map tasks partition their output, each creating one partition for each reduce task. In each partition, there can be many keys and their associated values but the records for any given key are all in a single partition. + +Hadoop allows users to control the partitioning by specifying a user-defined partitioning function. Generally, there is a default Partitioner that buckets the keys using the hash function. + +2. Reduce phase: +The various phases in reduce task are as follows: + +a. Sort and Shuffle: + +The Reducer task starts with a shuffle and sort step. The main purpose of this phase is to collect the equivalent keys together. Sort and Shuffle phase downloads the data which is written by the partitioner to the node where Reducer is running. + +It sorts each data piece into a large data list. The MapReduce framework performs this sort and shuffles so that we can iterate over it easily in the reduce task. + +The sort and shuffling are performed by the framework automatically. The developer through the comparator object can have control over how the keys get sorted and grouped. + +b. Reduce: + +The Reducer which is the user-defined reduce function performs once per key grouping. The reducer filters, aggregates, and combines data in several different ways. Once the reduce task is completed, it gives zero or more key-value pairs to the OutputFormat. The reduce task output is stored in Hadoop HDFS. + +c. OutputFormat + +It takes the reducer output and writes it to the HDFS file by RecordWriter. By default, it separates key, value by a tab and each record by a newline character. + +hadoop mapreduce - hadoop architecture + +3. YARN +YARN stands for Yet Another Resource Negotiator. It is the resource management layer of Hadoop. It was introduced in Hadoop 2. + +YARN is designed with the idea of splitting up the functionalities of job scheduling and resource management into separate daemons. The basic idea is to have a global ResourceManager and application Master per application where the application can be a single job or DAG of jobs. + +YARN consists of ResourceManager, NodeManager, and per-application ApplicationMaster. + +apache hadoop yarn +1. ResourceManager +It arbitrates resources amongst all the applications in the cluster. + +It has two main components that are Scheduler and the ApplicationManager. + +a. Scheduler + +The Scheduler allocates resources to the various applications running in the cluster, considering the capacities, queues, etc. +It is a pure Scheduler. It does not monitor or track the status of the application. +Scheduler does not guarantee the restart of the failed tasks that are failed either due to application failure or hardware failure. +It performs scheduling based on the resource requirements of the applications. +b. ApplicationManager + +They are responsible for accepting the job submissions. +ApplicationManager negotiates the first container for executing application-specific ApplicationMaster. +They provide service for restarting the ApplicationMaster container on failure. +The per-application ApplicationMaster is responsible for negotiating containers from the Scheduler. It tracks and monitors their status and progress. +2. NodeManager: +NodeManager runs on the slave nodes. It is responsible for containers, monitoring the machine resource usage that is CPU, memory, disk, network usage, and reporting the same to the ResourceManager or Scheduler. + +3. ApplicationMaster: +The per-application ApplicationMaster is a framework-specific library. It is responsible for negotiating resources from the ResourceManager. It works with the NodeManager(s) for executing and monitoring the tasks. + +Summary +In this article, we have studied Hadoop Architecture. The Hadoop follows master-slave topology. The master nodes assign tasks to the slave nodes. The architecture comprises three layers that are HDFS, YARN, and MapReduce. + +HDFS is the distributed file system in Hadoop for storing big data. MapReduce is the processing framework for processing vast data in the Hadoop cluster in a distributed manner. YARN is responsible for managing the resources amongst applications in the cluster. + +The HDFS daemon NameNode and YARN daemon ResourceManager run on the master node in the Hadoop cluster. The HDFS daemon DataNode and the YARN NodeManager run on the slave nodes. + +HDFS and MapReduce framework run on the same set of nodes, which result in very high aggregate bandwidth across the cluster. + +Keep Learning!! \ No newline at end of file diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt.xml.xls" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Apache Hadoop Architecture \342\200\223 HDFS, YARN & MapReduce.txt.xml.xls" new file mode 100644 index 0000000000000000000000000000000000000000..5a7cac9932dabcd8a0bb4b7d70da7b279c2db650 GIT binary patch literal 30720 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 P_ceSD{r@5UbJP4CXnsY$ literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions-relation.txt new file mode 100644 index 0000000..5c09e91 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions-relation.txt @@ -0,0 +1,646 @@ +PROFILE Sanchita Paul Birla Institute&Technology , Mesra 49 publication&AGGREGATION +https://www.researchgate.net/publication/311558422 Big Data Analysis&Technology&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&soft computing and datum mining view project puneet singh duggal birla institute&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&Technology&依赖 +content&Puneet Singh Duggal&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&Technology&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&soft computing and datum mining view project puneet singh duggal birla institute&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&Technology&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&soft computing and datum mining view project puneet singh duggal birla institute&依赖 +content&10 december 2016&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&Technology&依赖 +Diabetes Diagnosis View project Prediction&thunderstorm and lightning&AGGREGATION +https://www.researchgate.net/publication/311558422 Big Data Analysis&soft computing and datum mining view project puneet singh duggal birla institute&依赖 +https://www.researchgate.net/publication/311558422 Big Data Analysis&soft computing and datum mining view project puneet singh duggal birla institute&依赖 +author&publication&AGGREGATION +soft computing and datum mining view project puneet singh duggal birla institute&Technology&AGGREGATION +user&downloaded file&依赖 +user&enhancement&依赖 +enhancement&downloaded file&AGGREGATION +Technology , Mesra , Ranchi , India duggal@gmail.com Sanchita Paul Department&Computer Science & Engineering Birla Institute&AGGREGATION +We&on-demand , on-command Digital universe&依赖 +Computer Science & Engineering Birla Institute&Technology , Mesra , Ranchi , India duggal@gmail.com Sanchita Paul Department&AGGREGATION +Computer Science & Engineering Birla Institute&Technology Mesra , Ranchi , India sanchita07@gmail.com Abstract —&AGGREGATION +challenge and solutions puneet singh duggal department&Computer Science & Engineering Birla Institute&AGGREGATION +its&Volume& +datum&" Big Data "&依赖 +Most&datum&AGGREGATION +it&nature&依赖 +heterogeneity&datum&AGGREGATION +volume&Big Data&依赖 +Traditional data management , warehousing and analysis system&datum&依赖 +specific nature&Big Data&AGGREGATION +it&specific nature&依赖 +it&Big Data&依赖 +its&nature& +it&large distributed file system&依赖 +Map Reduce&efficient analysis&依赖 +efficient analysis&Big Data&AGGREGATION +Map Reduce&Big Data&依赖 +Traditional DBMS technique&Big Data&依赖 +Traditional DBMS technique&classification and clustering&依赖 +classification and clustering&Big Data&AGGREGATION +author&various method&依赖 +author&catering&依赖 +author&various method&依赖 +author&catering&依赖 +use&file indexing&AGGREGATION +Minimization technique&use&依赖 +Minimization technique&file indexing&依赖 +Minimization technique&technique&GENERALIZATION +Map Reduce technique&paper&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&click stream datum&依赖 +Keyword-Big Data Analysis&everything&依赖 +structured ( traditional dataset&DBMS table&依赖 +Big Data&e-mail attachment&依赖 +structured ( traditional dataset&DBMS table&依赖 +structured ( traditional dataset&rows and column&依赖 +Big Data&datum&依赖 +structured ( traditional dataset&rows and column&依赖 +Big Data&structured ( traditional dataset&依赖 +heterogeneous mix&datum&AGGREGATION +80 percent&enterprise datum&AGGREGATION +whose size&typical database software tool&依赖 +whose&size& +“ Big data ”&dataset&依赖 +ability&typical database software tool&AGGREGATION +big datum analyticsis&area&依赖 +advanced analytic technique&big data set&依赖 +two&most profound trend&依赖 +two&one&依赖 +one&most profound trend ( bus ) [ 4 ]&AGGREGATION +it&heterogeneity , velocity and volume&依赖 +it&Big Data&依赖 +it&1 ] [ 2 ]&依赖 +it&traditional data analysis and management tool&依赖 +heterogeneity , velocity and volume&Big Data&AGGREGATION +problem&NoSQL&依赖 +problem&NoSQL&依赖 +it&transaction processing&依赖 +analysis&Big Data&AGGREGATION +it&Parallel&依赖 +Map Reduce&[ 12 ]&依赖 +its&architecture& +shared-nothing&commodity diverse hardware ( big cluster )&依赖 +Map Reduce&characteristic&依赖 +function&high-level programming language&依赖 +Its&functions& +Hive tool&tool&GENERALIZATION +Query processing&NoSQL&依赖 +Hive tool&[ 20 ]&依赖 +what&possible solution&依赖 +more business opportunity&affinity&依赖 +more business opportunity&affinity&依赖 +best suppliers , associate product&affinity&AGGREGATION +more business opportunity&sale seasonality [ 25 ] etc&依赖 +more business opportunity&best suppliers , associate product&依赖 +more business opportunity&best suppliers , associate product&依赖 +more business opportunity&sale seasonality [ 25 ] etc&依赖 +advanced form&analytics [ 6 ]&AGGREGATION +Traditional experience online analytic processing ( olap )&analytics [ 6 ]&依赖 +Traditional experience online analytic processing ( olap )&advanced form&依赖 +Organizations&specific form&实现 +Organizations&analytic&实现 +specific form&analytic&AGGREGATION +collection&related techniques and tool type&AGGREGATION +user&new business fact&依赖 +user&knew&依赖 +large volume&datum&AGGREGATION +analyst&detail&依赖 +analyst&large volume&依赖 +plenty&detail&AGGREGATION +analyst&plenty&依赖 +enterprise&analytics example&依赖 +enterprise&log datum&依赖 +analyst&datum&依赖 +subset&customer base&AGGREGATION +analyst&historic datum&依赖 +analyst&data warehouse&依赖 +company&new form&依赖 +other product&BI&AGGREGATION +company&customer behavioural change&依赖 +new form&customer behavioural change&AGGREGATION +discovery&metric , report , analytic model&依赖 +company&customer behavioural change&依赖 +company&new form&依赖 +different type&analytic tool&AGGREGATION +unique challenge&special processing system&依赖 +unique challenge&special processing system&依赖 +Map Reduce&[&依赖 +Map Reduce&[&依赖 +analysis&technique&依赖 +distributed file system architecture&original Google File System [ 13 ]&依赖 +Map Reduce job&efficient data processingtechnique&依赖 +Mapping , Combining , Shuffling , Indexing , Grouping and reduce&[ 7 ]&依赖 +phase&MapReduce&AGGREGATION +technique&Map Reduce task&实现 +technique&paper&依赖 +technique&implementation&依赖 +a result need&index&依赖 +a result need&index&依赖 +impact&world-wide Web&AGGREGATION +major issue&world-wide Web&依赖 +major issue&impact&依赖 +major issue&impact&依赖 +major issue&world-wide Web&依赖 +its&content& +Database technology&task&依赖 +company&topology&依赖 +company&information&依赖 +company&Web and users ‟ search history&依赖 +topology&Web and users ‟ search history&AGGREGATION +turn&further challenge&依赖 +turn&millennium&AGGREGATION +google ‟&challenge&实现 +challenge&web-scale datum management and analysis&AGGREGATION +google ‟&web-scale datum management and analysis&实现 +challenge&Web-scale storage&AGGREGATION +whose content&machine&依赖 +hundred&machine&AGGREGATION +whose&content& +whose content&machine&依赖 +it&large file&依赖 +whose content&machine&依赖 +programming model&model&GENERALIZATION +Google&Map Reduce programming model and platform [ 1 ] [ 13 ]&依赖 +its&model& +sort&partitioned parallelism&AGGREGATION +Map Reduce framework&datum&依赖 +Map Reduce framework&a common key (&依赖 +large collection&datum&AGGREGATION +Map Reduce framework&large collection&依赖 +group&instance&AGGREGATION +Facebook&suit&依赖 +its&system& +Hadoop system&traction&依赖 +it&use case include web indexing&依赖 +set&higher-level declarative language&AGGREGATION +Hadoop community&set&依赖 +Hadoop community&higher-level declarative language&依赖 +low-level nature&Map Reduce programming model&AGGREGATION +Popular language&Yahoo!&依赖 +Popular language&Pig&依赖 +Jaql&ibm [ 28 ]&依赖 +Jaql&[ 18 ]&依赖 +Pig&nature&依赖 +60 %&Yahoo!&AGGREGATION +90 %&Facebook Map Reduce use case&AGGREGATION +[ 27 ]&Dryad&依赖 +[ 27 ]&cover&依赖 +[ 27 ]&Dryad&依赖 +Microsoft&Hadoop [ 24 ]&依赖 +Microsoft&support&依赖 +its&strategy& +HADOOP AND HDFS Hadoop&data storage and processing&依赖 +it&hdf&依赖 +It&commodity hardware&依赖 +It&MapReduce&依赖 +It&distributed data processing&依赖 +[ 17 ] [ 19 ]&found&依赖 +software architecture&aHadoop stack&AGGREGATION +[ 17 ] [ 19 ]&layer&依赖 +file&byte&依赖 +( very large ) contiguous and randomly addressable sequence&byte&AGGREGATION +file&distributed file system&依赖 +hdf&Hadoop software stack&依赖 +hdf&bottom&依赖 +hdf&bottom&依赖 +hdf&Hadoop software stack&依赖 +file&( very large ) contiguous and randomly addressable sequence&依赖 +bottom&Hadoop software stack&AGGREGATION +HDFS file&file&GENERALIZATION +middle layer&batch analytic&依赖 +middle layer&batch analytic&依赖 +Hadoop Map Reduce system&HDFS file&依赖 +middle layer&stack&AGGREGATION +map phase&job&AGGREGATION +Hadoop Map Reduce system&map operation&依赖 +group&output data item&AGGREGATION +Hadoop Map Reduce system&map operation&依赖 +partition&HDFS file and sort&AGGREGATION +Hadoop Map Reduce system&partition&依赖 +hbase store (&basic key-based record management operation&依赖 +hbase store (&Hadoop stack&依赖 +hbase store (&key-value layer&依赖 +hbase store (&application&依赖 +hbase store (&application&依赖 +hbase store (&key-value layer&依赖 +hbase store (&Hadoop stack&依赖 +hbase store (&basic key-based record management operation&依赖 +top&hdf )&AGGREGATION +contents&HBase&AGGREGATION +Many user&declarative language&依赖 +MapReduce programming model&programming model&GENERALIZATION +Many user&bare MapReduce programming model&依赖 +Many user&Hadoop stack&AGGREGATION +Many user&use&依赖 +use&declarative language&AGGREGATION +High-level language compiler null&Hadoop software stack&依赖 +High-level language compiler null&Hadoop software stack&依赖 +High-level language compiler null&such client&依赖 +High-level language compiler null&such client&依赖 +HDFS Clusters Figure2&traditional experience&依赖 +collection&related technique&AGGREGATION +HDFS Clusters Figure2&relevancy&依赖 +HDFS Clusters Figure2&traditional experience&依赖 +HDFS Clusters Figure2&relevancy&依赖 +Figure 3&Hadoop&实现 +Figure 3&architecture&依赖 +architecture&HDFS clusters implementation&AGGREGATION +Figure 3&HDFS clusters implementation&依赖 +hdf&task&依赖 +Data analysis task&cluster&依赖 +BIG DATA ANALYSIS Heterogeneity&progress&依赖 +BIG DATA ANALYSIS Heterogeneity&progress&依赖 +BIG DATA ANALYSIS Heterogeneity&process&依赖 +phase&datum&依赖 +BIG DATA ANALYSIS Heterogeneity&process&依赖 +BIG DATA ANALYSIS Heterogeneity&phase&依赖 +phase&value&依赖 +BIG DATA ANALYSIS Heterogeneity&phase&依赖 +phase&process&AGGREGATION +much datum today&structured format&依赖 +images and video&storage and display&依赖 +piece&text&AGGREGATION +major creator&value&AGGREGATION +value&datum&AGGREGATION +most datum&digital format today&依赖 +we&opportunity&依赖 +scalability&algorithm&AGGREGATION +Big Data analysis&many application&依赖 +complexity&datum&AGGREGATION +lack&algorithm&AGGREGATION +lack&scalability&AGGREGATION +most&statistician&依赖 +its&interpretation& +presentation&result&AGGREGATION +most&BI related job&AGGREGATION +Figure 4&big data analysis tool&依赖 +glimpse&big data analysis tool&AGGREGATION +data storage part&HDFS distributed file system architecture&依赖 +other mention architecture&amazon web service ( aws ) [ 23 ] , hbase and cloudstore etc&依赖 +HDFS distributed file system architecture&distributed file system architecture&GENERALIZATION +part&hadoop and hdfs framework&AGGREGATION +velocity and heterogeneity&datum&AGGREGATION +volume and veracity&datum&AGGREGATION +layer&bedrock&依赖 +layer&Big Data management and analysis framework&依赖 +layer&Big Data management and analysis framework&依赖 +layer&bedrock&依赖 +their&tools& +MapReduce programming model&map ( )&依赖 +MapReduce programming model&two function and map ( )&依赖 +their&logic& +user&own processing logic&实现 +list&intermediate key/value pair&AGGREGATION +map ( ) function&input key/value pair&依赖 +mapreduce runtime system group&mapreduce runtime system group&依赖 +mapreduce runtime system group&mapreduce runtime system group&依赖 +signature&map ( )&AGGREGATION +one master node&slave node&依赖 +list ( v2 )&master-slave architecture&依赖 +list ( v2 )&master-slave architecture&依赖 +number&slave node&AGGREGATION +one master node&number&依赖 +one master node&19 ]&依赖 +Hadoop&MapReduce job&依赖 +MapReduce job&job&GENERALIZATION +data block&one TaskTracker node&依赖 +TaskTracker node&JobTracker&依赖 +scheduler&new task&依赖 +scheduler&it&依赖 +it&data block&依赖 +scheduler&data locality&依赖 +scheduler&account&依赖 +Map Reduce Architecture&local data block&依赖 +Map Reduce Architecture&TaskTracker&依赖 +scheduler&TaskTracker&依赖 +scheduler&rack-local or random data block&依赖 +runtime system group&reduce task&依赖 +set&reduce task&AGGREGATION +runtime system group&set&依赖 +hundreds or thousand&processor&AGGREGATION +scalability and i&heterogeneous and large dataset&依赖 +scalability and i&inbuilt process&依赖 +inbuilt process&heterogeneous and large dataset&AGGREGATION +scalability and i&status and monitoring&依赖 +status and monitoring&heterogeneous and large dataset&AGGREGATION +scalability and i&status and monitoring&依赖 +scalability and i&heterogeneous and large dataset&依赖 +scalability and i&inbuilt process&依赖 +Node –&file&依赖 +Node –&HDFS metada&依赖 +Node –&doesn ‟ t deal&依赖 +Data Node – stores block&HDFS – default replication level&AGGREGATION +job tracker – schedule&job tracker – schedule&依赖 +Task Tracker –&Mapper and Reducer interface&实现 +core&job&AGGREGATION +1 ) mapper mapper&input key/value pair&依赖 +1 ) mapper mapper&intermediate key/value pair&依赖 +1 ) mapper mapper&set&依赖 +set&intermediate key/value pair&AGGREGATION +individual task&input record&依赖 +individual task&intermediate record&依赖 +zero or many output pair&19 ]&依赖 +block&input file&AGGREGATION +number&map&AGGREGATION +total number&block&AGGREGATION +number&input&依赖 +number&total size&依赖 +total size&input&AGGREGATION +right level¶llelism&AGGREGATION +map&execute&依赖 +map&minute&依赖 +10TB&input datum&AGGREGATION +you&input datum&依赖 +blocksize&128MB&AGGREGATION +you&10TB&依赖 +with 82,000 map&17 ] [ 19 ]&依赖 +smaller set&value&AGGREGATION +2 ) reducer reducer&intermediate value&依赖 +intermediate value&key&依赖 +intermediate value&value&依赖 +intermediate value&smaller set&依赖 +set&intermediate value&AGGREGATION +2 ) reducer reducer&set&依赖 +Reducer&3 primary phase&依赖 +Reducer&shuffle&依赖 +2.1 ) shuffle input&mapper&依赖 +2.1 ) shuffle input&mapper&依赖 +sorted output&mapper&AGGREGATION +framework&HTTP&依赖 +framework&relevant partition&依赖 +framework&HTTP&依赖 +output&mapper&AGGREGATION +framework&output&依赖 +relevant partition&output&AGGREGATION +framework&relevant partition&依赖 +framework&output&依赖 +framework group&key&依赖 +framework group&have&依赖 +framework group&reducer input&依赖 +one&a comparator ( secondary sort )&依赖 +( list&value&AGGREGATION +grouped inputs.The output&reduce task&AGGREGATION +application&Reporter&依赖 +output&Reducer&AGGREGATION +right number&reduce&AGGREGATION +better job&load balancing [ MR Framework ]&AGGREGATION +their&round& +faster node&reduce&依赖 +faster node&reduce&依赖 +faster node&first round&依赖 +faster node&first round&依赖 +first round&reduce&AGGREGATION +number&reduce&AGGREGATION +cost&failure&AGGREGATION +scaling factor&a few reduce slot&依赖 +scaling factor&speculative-task&依赖 +It&number&依赖 +number&reduce-task&AGGREGATION +It&reduce-task&依赖 +a ) partitioner partitioner partition&key space&依赖 +Partitioner&key&依赖 +key&intermediate map-output&AGGREGATION +Partitioner&intermediate map-output&依赖 +partitioning&key&AGGREGATION +Partitioner&partitioning&依赖 +subset&key )&AGGREGATION +number&job&依赖 +number&reduce task&依赖 +number&of&AGGREGATION +total number&partition&AGGREGATION +this control&task&依赖 +intermediate key (&for reduction&依赖 +b ) reporter reporter&MapReduce application&依赖 +counters.mapper and reducer implementation&Reporter&依赖 +counters.mapper and reducer implementation&progress&依赖 +application&time&依赖 +significant amount&time&AGGREGATION +application&significant amount&依赖 +framework&task&依赖 +application&counter&依赖 +application&Reporter&依赖 +c ) output collector output collector&facility&依赖 +MapReduce framework&framework&GENERALIZATION +name node –&HDFS metada&依赖 +generalization&facility&AGGREGATION +RGPV 274 output&job )&AGGREGATION +library&useful mapper&AGGREGATION +amount&intermediate datum&AGGREGATION +They&" mini-reducer&依赖 +" mini-reducer&mapper&依赖 +" mini-reducer&output&依赖 +combiner&term& +result&collection&依赖 +result&term&依赖 +result&order&依赖 +result&order&依赖 +result&total number&依赖 +result&collection&依赖 +result&network&依赖 +result&collection&依赖 +number&intermediate key-value pair&AGGREGATION +result&total number&依赖 +result&network&依赖 +result&term&依赖 +result&total number&依赖 +result&term&依赖 +result&collection&依赖 +total number&term&AGGREGATION +result&term&依赖 +result&network&依赖 +order&total number&AGGREGATION +result&order&依赖 +order&number&AGGREGATION +number&unique term&AGGREGATION +result&network&依赖 +result&order&依赖 +result&total number&依赖 +They&result size&依赖 +machine&shuffling cost&依赖 +result size&map function&AGGREGATION +They&map function&依赖 +keyword&technique&依赖 +they&document key&依赖 +keyword&which&依赖 +keyword&document&AGGREGATION +keyword&document key&依赖 +they&which&依赖 +> doc4 :24 shuffling shuffling&IMF , Financial Economics Crisis Doc2&依赖 +index&file&AGGREGATION +their&keys& +> doc4 :24 shuffling shuffling&example Doc1&依赖 +harry potter crisis follow&above data IMF&依赖 +inverted index&above data IMF&AGGREGATION +heterogeneous mix&dataset&AGGREGATION +better chance&accurate result&依赖 +We&population&依赖 +We&generating&依赖 +We&shuffling process&依赖 +process&nature&依赖 +their&purpose& +Cartesian product&datum&AGGREGATION +datum&possible combination&AGGREGATION +its&techniques& +Map Reduce&own Join technique&依赖 +it&Map Reduce&依赖 +it&means&依赖 +iterative work&partitioning&依赖 +iterative work&datum&依赖 +iterative work&datum&依赖 +partitioning&datum&AGGREGATION +iterative work&partitioning&依赖 +data sort&clustering&依赖 +new centre&Step 8&依赖 +new centre&Repeat 1-7&依赖 +their&Step7& +one&k centre&AGGREGATION +new centre&Step 8&依赖 +all datum point¢re&依赖 +Input&k centre&依赖 +new centre&Repeat 1-7&依赖 +new centre&Repeat 1-7&依赖 +new centre&Step 8&依赖 +process enormous quantity&datum&AGGREGATION +dizzying array&source&AGGREGATION +organization&customer&依赖 +competitive advantage&6 ]&依赖 +their&customers& +large and heterogeneous dataset&RGPV 275&依赖 +large and heterogeneous dataset&RGPV 275&依赖 +large and heterogeneous dataset&continuous flow&依赖 +large and heterogeneous dataset&Nov 13-15&依赖 +large and heterogeneous dataset&RGPV 275&依赖 +large and heterogeneous dataset&Nov 13-15&依赖 +engineer&information processing tools and application&依赖 +continuous flow&datum&AGGREGATION +large and heterogeneous dataset&RGPV 275&依赖 +large and heterogeneous dataset&datum&依赖 +large and heterogeneous dataset&Nov 13-15&依赖 +large and heterogeneous dataset&Nov 13-15&依赖 +wide range&task&AGGREGATION +large and heterogeneous dataset&Nov 13-15&依赖 +large and heterogeneous dataset&RGPV 275&依赖 +massive amount&datum&AGGREGATION +mystery&life&AGGREGATION +secret&cosmos&AGGREGATION +variety&problem&AGGREGATION +tool&task&依赖 +single opportunity&map&依赖 +many example&algorithm&AGGREGATION +them&barrier&实现 +single opportunity&map&依赖 +phase&processing )&AGGREGATION +them&map&实现 +existence&shared global state&AGGREGATION +them&mapreduce (&实现 +single opportunity&map&依赖 +model parameter&shared global state&依赖 +model&training datum&依赖 +process&access&依赖 +process&access&依赖 +process&state&依赖 +process&state&依赖 +process&access&依赖 +process&state&依赖 +synchronization&MapReduce framework&依赖 +synchronization&resource&AGGREGATION +update&one or more reducer&依赖 +synchronization&batch learner&依赖 +update&driver code )&依赖 +smaller number&instance&AGGREGATION +design choice&most existing MapReduce implementation&AGGREGATION +faster processing&smaller dataset&AGGREGATION +style&insufficient use&依赖 +style&insufficient use&依赖 +MapReduce&batch operation&依赖 +MapReduce&datum&依赖 +MapReduce&large amount&依赖 +insufficient use&resource&AGGREGATION +large amount&datum&AGGREGATION +style&computation&AGGREGATION +style&resource&依赖 +style&resource&依赖 +ADVANCEMENTS stream&dealing&依赖 +ADVANCEMENTS stream&alternative programming model&依赖 +one or more stream&input&AGGREGATION +its&design& +Pregel [ 16 ]&programming model&实现 +Valiant&model& +Pregel&large-scale graph algorithm&依赖 +Pig [ 28 ]&data analytics platform&依赖 +Pig script&join&依赖 +Pig script&execution engine&依赖 +Pig script&Hadoop job&依赖 +Pig&engine& +open-source project&user&依赖 +open-source project&large relational dataset&依赖 +open-source project&SQL query&依赖 +top&Hadoop&AGGREGATION +advantage&datum processing capability&AGGREGATION +Hadoop&capabilities& +user&abstraction&AGGREGATION +power&MapReduce&AGGREGATION +power&large cluster&AGGREGATION +development&alternative approach&AGGREGATION +MapReduce&Hadoop/HDFS/MapReduceecosystem&依赖 +MapReduce&generalization&依赖 +MapReduce&Hadoop/HDFS/MapReduceecosystem&依赖 +paper&Map Reduce task&依赖 +join processing mention&n&依赖 +join processing mention&n&依赖 +drawback&present system&AGGREGATION +future direction&traditional datum analysis tool&依赖 +future direction&traditional datum analysis tool&依赖 +paradigm&HDFS and Hadoop&AGGREGATION +1 ] jefry dean and MapReduce&1 ] jefry dean and MapReduce&依赖 +A Flexible Data Processing Tool and Communications and Volume 53&pp 72-77&依赖 +A Flexible Data Processing Tool and Communications and Volume 53&pp 72-77&依赖 +A Flexible Data Processing Tool and Communications and Volume 53&pp 72-77&依赖 +A Flexible Data Processing Tool and Communications and Volume 53&pp 72-77&依赖 +Communications&ACM&AGGREGATION +[ 2 ] jefry dean&[ 2 ] jefry dean&依赖 +Communications&ACM , Volume 51 pp.&AGGREGATION +you&era&依赖 +you&„ big data ‟&依赖 +era&„ big data ‟&AGGREGATION +University&Houston&AGGREGATION +Comparison&Join Algorithms&AGGREGATION +13 ] S. Ghemawat&Google File System&依赖 +[ 16 ] grzegorzmalewicz&pp 135-145&依赖 +[ 16 ] grzegorzmalewicz&pp 135-145&依赖 +[ 16 ] grzegorzmalewicz&pp 135-145&依赖 +[ 16 ] grzegorzmalewicz&pp 135-145&依赖 +[ 16 ] grzegorzmalewicz&pp 135-145&依赖 +/ / www.microsoft.com/windowsazure/features/storage/ [ 25 ] The Age&Big Data&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt new file mode 100644 index 0000000..a36ff99 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt @@ -0,0 +1,146 @@ +See discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/311558422 +Big Data Analysis: Challenges and Solutions +Conference Paper · December 2013 +CITATIONS +40 +READS +4,637 +2 authors: +Some of the authors of this publication are also working on these related projects: +Soft Computing Approach for Diabetes Diagnosis View project +Prediction of thunderstorm and lightning using soft computing and data mining View project +Puneet Singh Duggal +Birla Institute of Technology, Mesra +2 PUBLICATIONS 43 CITATIONS +SEE PROFILE +Sanchita Paul +Birla Institute of Technology, Mesra +49 PUBLICATIONS 402 CITATIONS +SEE PROFILE +All content following this page was uploaded by Puneet Singh Duggal on 10 December 2016. +The user has requested enhancement of the downloaded file. +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +269 +Big Data Analysis: Challenges and Solutions Puneet Singh Duggal Department of Computer Science & Engineering Birla Institute of Technology, Mesra, Ranchi, India duggal@gmail.com +Sanchita Paul Department of Computer Science & Engineering Birla Institute of Technology Mesra, Ranchi, India +sanchita07@gmail.com Abstract—We live in on-demand, on-command Digital universe with data prolifering by Institutions, Individuals and Machines at a very high rate. This data is categories as "Big Data" due to its sheer Volume, Variety, Velocity and Veracity. Most of this data is unstructured, quasi structured or semi structured and it is heterogeneous in nature. The volume and the heterogeneity of data with the speed it is generated, makes it difficult for the present computing infrastructure to manage Big Data. Traditional data management, warehousing and analysis systems fall short of tools to analyze this data. Due to its specific nature of Big Data, it is stored in distributed file system architectures. Hadoop and HDFS by Apache is widely used for storing and managing Big Data. Analyzing Big Data is a challenging task as it involves large distributed file systems which should be fault tolerant, flexible and scalable. Map Reduce is widely been used for the efficient analysis of Big Data. Traditional DBMS techniques like Joins and Indexing and other techniques like graph search is used for classification and clustering of Big Data. These techniques are being adopted to be used in Map Reduce. In this research paper the authors suggest various methods for catering to the problems in hand through Map Reduce framework over Hadoop Distributed File System (HDFS). Map Reduce is a Minimization technique which makes use of file indexing with mapping, sorting, shuffling and finally reducing. Map Reduce techniques have been studied at in this paper which is implemented for Big Data analysis using HDFS. Keyword-Big Data Analysis, Big Data Management, Map Reduce, HDFS +I. INTRODUCTION +Big Data encompasses everything from click stream data from the web to genomic and proteomic data from biological research and medicines. Big Data is a heterogeneous mix of data both structured (traditional datasets –in rows and columns like DBMS tables, CSV's and XLS's) and unstructured data like e-mail attachments, manuals, images, PDF documents, medical records such as x-rays, ECG and MRI images, forms, rich media like graphics, video and audio, contacts, forms and documents. Businesses are primarily concerned with managing unstructured data, because over 80 percent of enterprise data is unstructured [26] and require significant storage space and effort to manage.“Big data” refers to datasets whose size is beyond the ability of typical database software tools to capture, store, manage, and analyse [3]. +Big data analyticsis the area where advanced analytic techniques operate on big data sets. It is really about two things, Big data and Analytics and how the two have teamed up to create one of the most profound trends in business intelligence (BI) [4]. Map Reduce by itself is capable for analysing large distributed data sets; but due to the heterogeneity, velocity and volume of Big Data, it is a challenge for traditional data analysis and management tools [1] [2]. A problem with Big Data is that they use NoSQL and has no Data Description Language (DDL) and it supports transaction processing. Also, web-scale data is not universal and it is heterogeneous. For analysis of Big Data, database integration and cleaning is much harder than the traditional mining approaches [4]. Parallel processing and distributed computing is becoming a standard procedure which are nearly non-existent in RDBMS. Map Reduce has following characteristics [12]; it supports Parallel and distributed processing, it is simple and its architecture is shared-nothing which has commodity diverse hardware (big cluster).Its functions are programmed in a high-level programming language (e.g. Java, Python) and it is flexible. Query processing is done through NoSQL integrated in HDFS as Hive tool [20]. Analytics helps to discover what has changed and the possible solutions. Second, advanced analytics is the best way to discover more business opportunities, new customer segments, identify the best suppliers, associate products of affinity, understand sales seasonality[25] etc. Traditional experience in data warehousing, reporting, and online analytic processing (OLAP) is different for advanced forms of analytics [6]. Organizations are implementing specific forms of analytics, particularly called advanced analytics. These are an collection of related techniques and tool types, usually including predictive analytics, data mining, statistical analysis, complex SQL, data visualization, artificial intelligence, natural language processing. Database analytics platforms such as MapReduce, in-database analytics, in-memory databases, and columnar data stores [6] [9] are used for standardizing them. +With big data analytics, the user is trying to discover new business facts that no one in the enterprise knew before, a better term would be “discovery analytics. To do that, the analyst needs large volumes of data with plenty of detail. This is often data that the enterprise has not yet tapped for analytics example, the log data. The analyst might mix that data with historic data from a data warehouse and would discover for example, new change behaviour in a subset of the customer base. The discovery would lead to a metric, report, analytic model, or some other product of BI, through which the company could track and predict the new form of customer behavioural change. +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +270 +Discovery analytics against big data can be enabled by different types of analytic tools, including those based on SQL queries, data mining, statistical analysis, fact clustering, data visualization, natural language processing, text analytics, artificial intelligence etc [4-6]. A unique challenge for researchers system and academicians is that the large datasets needs special processing systems [5]. Map Reduce over HDFS gives Data Scientists [1-2] the techniques through which analysis of Big Data can be done. HDFS is a distributed file system architecture which encompasses the original Google File System [13].Map Reduce jobs use efficient data processingtechniques which can be applied in each of the phases of MapReduce; namely Mapping, Combining, Shuffling,Indexing, Grouping and Reducing [7]. All these techniques have been studied in this paper for implementation in Map Reduce tasks. +II. BIG DATA : OPPORTUNITIES AND CHALLENGES +In the distributed systems world, “Big Data” started to become a major issue in the late 1990‟s due to the impact of the world-wide Web and a resulting need to index and query its rapidly mushrooming content. Database technology (including parallel databases) was considered for the task, but was found to be neither well-suited nor cost-effective [5] for those purposes. The turn of the millennium then brought further challenges as companies began to use information such as the topology of the Web and users‟ search histories in order to provide increasingly useful search results, as well as more effectively-targeted advertising to display alongside and fund those results. Google‟s technical response to the challenges of Web-scale data management and analysis was simple, by database standards, but kicked off what has become the modern “Big Data” revolution in the systems world [3]. To handle the challenge of Web-scale storage, the Google File System (GFS) was created [13]. GFS provides clients with the familiar OS-level byte-stream abstraction, but it does so for extremely large files whose content can span hundreds of machines in shared-nothing clusters created using inexpensive commodity hardware [5]. To handle the challenge of processing the data in such large files, Google pioneered its Map Reduce programming model and platform [1][13]. This model, characterized by some as “parallel programming for dummies”, enabled Google‟s developers to process large collections of data by writing two user-defined functions, map and reduce, that the Map Reduce framework applies to the instances (map) and sorted groups of instances that share a common key (reduce) – similar to the sort of partitioned parallelism utilized in shared-nothing parallel query processing. +Driven by very similar requirements, software developers at Yahoo!, Facebook, and other large Web companies followed suit. Taking Google‟s GFS and Map Reduce papers as rough technical specifications, open-source equivalents were developed, and the Apache Hadoop Map Reduce platform and its underlying file system (HDFS, the Hadoop Distributed File System) were born [1] [12]. The Hadoop system has quickly gained traction, and it is now widely used for use cases including Web indexing, clickstream and log analysis, and certain large-scale information extraction and machine learning tasks. Soon tired of the low-level nature of the Map Reduce programming model, the Hadoop community developed a set of higher-level declarative languages for writing queries and data analysis pipelines that are compiled into Map Reduce jobs and then executed on the Hadoop Map Reduce platform. Popular languages include Pig from Yahoo! [18], Jaql from IBM [28], and Hive from Facebook [18]. Pig is relational-algebra-like in nature, and is reportedly used for over 60% of Yahoo!‟s MapReduce use cases; Hive is SQL-inspired and reported to be used for over 90% of the Facebook Map Reduce use cases. Microsoft‟s technologies include a parallel runtime system called Dryad and two higher-level programming models, Dryad LINQ and the SQLlike SCOPE language [27], which utilizes Dryad under the covers. Interestingly, Microsoft has also recently announced that its future “Big Data” strategy includes support for Hadoop[24]. +III. HADOOP AND HDFS +Hadoop is a scalable, open source, fault-tolerant Virtual Grid operating system architecture for data storage and processing. It runs on commodity hardware, it uses HDFS which is fault-tolerant high-bandwidth clustered storage architecture. It runs MapReduce for distributed data processing and is works with structured and unstructured data. +Figure1Illustrates the layers found in the software architecture of aHadoop stack [17] [19]. At the bottom of the Hadoop software stack is HDFS, a distributed file system in which each file appears as a (very large) contiguous and randomly addressable sequence of bytes. For batch analytics, the middle layer of the stack is the Hadoop Map Reduce system, which applies map operations to the data in partitions of an HDFS file, sorts and redistributes the results based on key values in the output data, and then performs reduce operations on the groups of output data items with matching keys from the map phase of the job. For applications just needing basic key-based record management operations, the HBase store (layered on top of HDFS) is available as a key-value layer in the Hadoop stack. As indicated in the figure, the contents of HBase can either be directly accessed and manipulated by a client application or accessed via Hadoop for analytical needs. Many users of the Hadoop stack prefer the use of a declarative language over the bare MapReduce programming model. High-level language compilers (Pig and Hive) are thus the topmost layer in the Hadoop software stack for such clients. +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +271 +Figure 1.Hadoop Architecture Layers Figure 2.Hadoop Architecture Tools and usage +Figure 3. HDFS Clusters +Figure2 shows the relevancy between the traditional experience in data warehousing, reporting, and online analytic processing (OLAP) and advanced analytics with collection of related techniques like data mining with DBMS, artificial intelligence, machine learning, and database analytics platforms such as MapReduce and Hadoop over HDFS [4] [9]. Figure 3 shows the architecture of HDFS clusters implementation with Hadoop. It can be seen that HDFS has distributed the task over two parallel clusters with one server and two slave nodes each. Data analysis tasks are distributed in these clusters. +IV. BIG DATA ANALYSIS +Heterogeneity, scale, timeliness, complexity, and privacy problems with Big Data hamper the progress at all phases of the process that can create value from data. Much data today is not natively in structured format; for example, tweets and blogs are weakly structured pieces of text, while images and video are structured for storage and display, but not for semantic content and search: transforming such content into a structured format for later analysis is a major challenge [15]. The value of data enhances when it can be linked with other data, thus data integration is a major creator of value. Since most data is directly generated in digital format today, we have the opportunity and the challenge both to influence the creation to facilitate later linkage and to automatically link previously created data. Data analysis, organization, retrieval, and modelling are other foundational challenges [6]. Big Data analysis is a clear bottleneck in many applications, both due to lack of scalability of the underlying algorithms and due to the complexity of the data that needs to be analysed. Finally, presentation of the results and its interpretation by non-technical domain experts is crucial to extracting actionable knowledge as most of the BI related jobs are handled by statisticians and not software experts. +Figure 4, below gives a glimpse of the Big Data analysis tools which are used for efficient and precise data analysis and management jobs. The Big Data Analysis and management setup can be understood through the layered structured defined in the figure. The data storage part is dominated by the HDFS distributed file system architecture; other mentioned architectures available are Amazon Web Service (AWS) [23], Hbase and CloudStore etc. The data processing tasks for all the tools is Map Reduce; we can comfortably say that it is the de-facto Data processing tool used in the Big Data paradigm. +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +272 +Figure 4. Big Data Analysis Tools +For handling the velocity and heterogeneity of data, tools like Hive, Pig and Mahout are used which are parts of Hadoop and HDFS framework. It is interesting to note that for all the tools used, Hadoop over HDFS is the underlying architecture. Oozie and EMR with Flume and Zookeeper are used for handling the volume and veracity of data, which are standard Big Data management tools. The layer with their specified tools forms the bedrock for Big Data management and analysis framework. +V. MAP REDUCE +MapReduce [1-2] is a programming model for processing large-scale datasets in computer clusters. The MapReduce programming model consists of two functions, map() and reduce(). Users can implement their own processing logic by specifying a customized map() and reduce() function. The map() function takes an input key/value pair and produces a list of intermediate key/value pairs. The MapReduce runtime system groups together all intermediate pairs based on the intermediate keys and passes them to reduce() function for producing the final results. Map (in_key, in_value) --->list(out_key,intermediate_value) Reduce (out_key,list(intermediate_value)) -- ->list(out_value) The signatures of map() and reduce() are as follows : map (k1,v1) ! list(k2,v2)and reduce (k2,list(v2)) ! list(v2) +A MapReduce cluster employs a master-slave architecture where one master node manages a number of slave nodes [19]. In the Hadoop, the master node is called JobTracker and the slave node is called TaskTracker as shown in the figure 7. Hadoop launches a MapReduce job by first splitting the input dataset into even-sized data blocks. Each data block is then scheduled to one TaskTracker node and is processed by a map task. The TaskTracker node notifies the JobTracker when it is idle. The scheduler then assigns new tasks to it. The scheduler takes data locality into account when it disseminates data blocks. +Figure 5. Map Reduce Architecture and Working It always tries to assign a local data block to a TaskTracker. If the attempt fails, the scheduler will assign a rack-local or random data block to the TaskTracker instead. When map() functions complete, the runtime system groups all intermediate pairs and launches a set of reduce tasks to produce the final results. Large scale data processing is a difficult task, managing hundreds or thousands of processors and managing parallelization and distributed environments makes is more difficult. Map Reduce provides solution to the mentioned issues, as is supports distributed and parallel I/O scheduling, it is fault tolerant and supports scalability and i has inbuilt processes for status and monitoring of heterogeneous and large datasets as in Big Data [14]. +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +273 +A. Map Reduce Components +1. Name Node – manages HDFS metadata, doesn‟t deal with files directly +2. Data Node – stores blocks of HDFS – default replication level for each block: 3 +3. Job Tracker – schedules, allocates and monitors job execution on slaves – Task Trackers +4. Task Tracker – runs Map Reduce operations +Figure 6.Map Reduce Components +B. Map Reduce Working +We implement the Mapper and Reducer interfaces to provide the map and reduce methods as shown in figure 6. These form the core of the job. +1) Mapper +Mapper maps input key/value pairs to a set of intermediate key/value pairs. Maps are the individual tasks that transform input records into intermediate records. The transformed intermediate records do not need to be of the same type as the input records. A given input pair may map to zero or many output pairs [19]. The number of maps is usually driven by the total size of the inputs, that is, the total number of blocks of the input files. The right level of parallelism for maps seems to be around 10-100 maps per-node, although it has been set up to 300 maps for very cpu-light map tasks. Task setup takes awhile, so it is best if the maps take at least a minute to execute. For Example, if you expect 10TB of input data and have a blocksize of 128MB, you'll end up with 82,000 maps [17] [19]. +2) Reducer +Reducer reduces a set of intermediate values which share a key to a smaller set of values. Reducer has 3 primary phases: shuffle, sort and reduce. +2.1) Shuffle +Input to the Reducer is the sorted output of the mappers. In this phase the framework fetches the relevant partition of the output of all the mappers, via HTTP. +2.2) Sort +The framework groups Reducer inputs by keys (since different mappers may have output the same key) in this stage. The shuffle and sort phases occur simultaneously; while map-outputs are being fetched they are merged. +2.3) Secondary Sort +If equivalence rules for grouping the intermediate keys are required to be different from those for grouping keys before reduction, then one may specify a Comparator (Secondary Sort ). +2.4) Reduce +In this phase the reduce method is called for each pair in the grouped inputs.The output of the reduce task is typically written to the File System via Output Collector[19]. +Applications can use the Reporter to report progress, set application-level status messages and update Counters, or just indicate that they are alive. The output of the Reducer is not sorted. The right number of reduces seems to be 0.95 or 1.75 multiplied by no. of nodes. With 0.95 all of the reduces can launch immediately and start transferring map outputs as the maps finish. With 1.75 the faster nodes will finish their first round of reduces and launch a second wave of reduces doing a much better job of load balancing [MR Framework].Increasing the number of reduces increases the framework overhead, but increases load balancing and lowers the cost of failures. The scaling factors above are slightly less than whole numbers to reserve a few reduce slots in the framework for speculative-tasks and failed tasks. It is legal to set the number of reduce-tasks to zero if no reduction is desired. +a) Partitioner +Partitioner partitions the key space. Partitioner controls the partitioning of the keys of the intermediate map-outputs. The key (or a subset of the key) is used to derive the partition, typically by a hash function. The total number of partitions is the same as the number of reduce tasks for the job. Hence this controls which of the m reduce tasks the intermediate key (and hence the record) is sent to for reduction. +Hash Partitioner is the default Partitioner. +b) Reporter +Reporter is a facility for MapReduce applications to report progress, set application-level status messages and update Counters.Mapper and Reducer implementations can use the Reporter to report progress or just indicate that they are alive. In scenarios where the application takes a significant amount of time to process individual key/value pairs, this is crucial since the framework might assume that the task has timed-out and kill that task. Applications can also update Counters using the Reporter. +c) Output Collector +Output Collector is a generalization of the facility provided by the MapReduce framework to collect data output by the Mapper or the Reducer (either the intermediate outputs or the +Name Node–manages HDFS metadata, doesn’t deal with files directly +Data Node –stores blocks of HDFS –default replication level for each block: 3 +Job Tracker –schedules, allocates and monitors job execution on slaves –Task Trackers +Task Tracker –runs Map Reduce operations +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +274 +output of the job). HadoopMapReduce comes bundled with a library of generally useful mappers, reducers, and partitioners +Figure 7. Map Reduce Working through Master / Slave +C. Map Reduce techniques + Combining +Combiners provide a general mechanism within the MapReduce framework to reduce the amount of intermediate data generated by the mappers. They can be understood as "mini-reducers" that process the output of mappers. The combiner's aggregate term counts across the documents processed by each map task. This result in a reduction in the number of intermediate key-value pairs that need to be shuffled across the network, from the order of total number of terms in the collection to the order of the number of unique terms in the collection. They reduce the result size of map functions and perform reduce-like function in each machine which decreases the shuffling cost. + Inverse Indexing +Inverse indexing is a technique in which the keywords of the documents are mapped according to the document keys in which they are residing. For example Doc1: IMF, Financial Economics Crisis Doc2: IMF, Financial Crisis Doc3: Harry Economics Doc4: Financial Harry Potter Film Doc5: Harry Potter Crisis The following is the inverted index of the above data IMF -> Doc1:1, Doc2:1 Financial -> Doc1:6, Doc2:6, Doc4:1 Economics -> Doc1:16, Doc3:7 Crisis -> Doc1:26, Doc2:16, Doc5:14 Harry -> Doc3:1, Doc4:11, Doc5:1 Potter -> Doc4:17, Doc5:7 Film -> Doc4:24 + Shuffling +Shuffling is the procedure of mixing the indexes of the files and their keys, so that a heterogeneous mix of dataset can be obtained. If the dataset is shuffled, then there are better chances that the resultant query processing will yield near accurate results. We can relate the shuffling process with the population generating by crossover in the GA algorithms. The processes are different in nature, but their purpose is similar.[7] + Sharding +It is a term used to distribute the Mappers in the HDFS architecture. Sharding refers to the groupings or documents which are done so that the MapReduce jobs are done parallel in a distributed environment. + Joins +Join is a RDBMS term; it refers to combining two or more discrete datasets to get Cartesian product of data of all the possible combinations. Map Reduce does not have its own Join techniques, but RDBMS techniques are tweaked and used to get the maximum possible combinations.The join techniques which are adopted for Map Reduce are Equi Join, Self Join, Repartition Join and Theta Join [7][10-11]. + Clustering & Classification +They are Data Analysis term, used mainly in Data Mining. In Map Reduce it is achieved through K means clustering [7]. Here, iterative working improves partitioning of data into k clusters. After the clustering, the data sorted are grouped together based upon rules to be formed into classes. The steps for clustering in Map Reduce are; Step1: Do Step2: Map Step3: Input is a data point and k centres are broadcasted Step4: Finds the closest centre among k centres for the input point Step5: Reduce Step6: Input is one of k centres and all data points having this centre as their closest centre Step7: Calculates the new centre using data points Step 8: Repeat 1-7, until all of new centres are not changed +VI. CONCLUSION +The need to process enormous quantities of data has never been greater. Not only are terabyte- and petabyte-scale datasets rapidly becoming commonplace, but there is consensus that great value lies buried in them, waiting to be unlocked by the right computational tools. In the commercial sphere, business intelligence, driven by the ability to gather data from a dizzying array of sources. Big Data analysis tools like Map Reduce over Hadoop and HDFS, promises to help organizations better understand their customers and the marketplace, hopefully leading to better business decisions and competitive advantages [6]. For engineers building information processing tools and applications, large and heterogeneous datasets which are generating continuous flow of data, lead to more effective algorithms for a wide range of tasks, from machine translation +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +275 +to spam detection. In the natural and physical sciences, the ability to analyse massive amounts of data may provide the key to unlocking the secrets of the cosmos or the mysteries of life. MapReduce can be exploited to solve a variety of problems related to text processing at scales that would have been unthinkable a few years ago [15]. No tool no matter how powerful or flexible can be perfectly adapted to every task. There are many examples of algorithms that depend crucially on the existence of shared global state during processing, making them difficult to implement in MapReduce (since the single opportunity for global synchronization in MapReduce is the barrier between the map and reduce phases of processing). Implementing online learning algorithms in MapReduce is problematic [14]. The model parameters in a learning algorithm can be viewed as shared global state, which must be updated as the model is evaluated against training data. All processes performing the evaluation (presumably the mappers) must have access to this state. In a batch learner, where updates occur in one or more reducers (or, alternatively, in the driver code), synchronization of this resource is enforced by the MapReduce framework. However, with online learning, these updates must occur after processing smaller numbers of instances. This means that the framework must be altered to support faster processing of smaller datasets, which goes against the design choices of most existing MapReduce implementations. Since MapReduce was specifically optimized for batch operations over large amounts of data, such a style of computation would likely result in insufficient use of resources [2]. In Hadoop, for example, map and reduce tasks have considerable start-up costs. +VII. ADVANCEMENTS +Streaming algorithms [9] represent an alternative programming model for dealing with large volumes of data with limited computational and storage resources. This model assumes that data are presented to the algorithm as one or more streams of inputs that are processed in order, and only once. Stream processing is very attractive for working with time-series data (news feeds, tweets, sensor readings, etc.), which is difficult in MapReduce (once again, given its batch-oriented design). Another system worth mentioning is Pregel [16], which implements a programming model inspired by Valiant's Bulk Synchronous Parallel (BSP) model. Pregel was specially designed for large-scale graph algorithms, but unfortunately there are few published details at present. +Pig [28], which is inspired by Google [13], can be described as a data analytics platform that provides a lightweight scripting language for manipulating large datasets. Although Pig scripts (in a language called Pig Latin) are ultimately converted into Hadoop jobs by Pig's execution engine through joins, allow developers to specify data transformations (filtering, joining, grouping, etc.) at a much higher level. Similarly, Hive [20], another open-source project, provides an abstraction on top of Hadoop that allows users to issue SQL queries against large relational datasets stored in HDFS. Hive queries, in HiveQL are compiled down to Hadoop jobs by the Hive query engine. Therefore, the system provides a data analysis tool for users who are already comfortable with relational databases, while simultaneously taking advantage of Hadoop's data processing capabilities [11]. The power of MapReduce derives from providing an abstraction that allows developers to harness the power of large clusters but abstractions manage complexity by hiding details and presenting well-defined behaviours to users of those abstractions. This process makes certain tasks easier, but others more difficult, if not impossible. MapReduce is certainly no exception to this generalization, even within the Hadoop/HDFS/MapReduceecosystem; it is already observed the development of alternative approaches for expressing distributed computations. For example, there can be a third merge phase after map and reduce to better support relational operations. Join processing mentioned n the paper can also tackle the Map Reduce tasks effectively. The future directions in Big Data analysis gives a very encouraging picture as the tools are build on the existing paradigm of HDFS and Hadoop, overcoming the existing drawback of the present systems and the advantages it provides over the traditional data analysis tools. +REFERENCES +[1] Jefry Dean and Sanjay Ghemwat, MapReduce:A Flexible Data Processing Tool, Communications of the ACM, Volume 53, Issuse.1,January 2010, pp 72-77. +[2] Jefry Dean and Sanjay Ghemwat,.MapReduce: Simplified data processing on large clusters, Communications of the ACM, Volume 51 pp. 107–113, 2008 +[3] Brad Brown, Michael Chui, and James Manyika, Are you ready for the era of „big data‟?,McKinseyQuaterly,Mckinsey Global Institute, October 2011. +[4] DunrenChe, MejdlSafran, and ZhiyongPeng, From Big Data to Big Data Mining: Challenges, Issues, and Opportunities, DASFAA Workshops 2013, LNCS 7827, pp. 1–15, 2013. +[5] MarcinJedyk, MAKING BIG DATA, SMALL, Using distributed systems for processing, analysing and managing large huge data sets, Software Professional‟s Network, Cheshire Data systems Ltd. +[6] OnurSavas, YalinSagduyu, Julia Deng, and Jason Li,Tactical Big Data Analytics: Challenges, Use Cases and Solutions, Big Data Analytics Workshop in conjunction with ACM Sigmetrics 2013,June 21, 2013. +[7] Kyuseok Shim, MapReduce Algorithms for Big Data Analysis, DNIS 2013, LNCS 7813, pp. 44–48, 2013. +[8] Raja.Appuswamy,ChristosGkantsidis,DushyanthNarayanan,OrionHodson,AntonyRowstron, Nobody ever got fired for buying a cluster, Microsoft Research, Cambridge, UK, Technical Report,MSR-TR-2013-2 +[9] Carlos Ordonez, Algorithms and Optimizations for Big Data Analytics: Cubes, Tech Talks,University of Houston, USA. +[10] Spyros Blanas, Jignesh M. Patel,VukErcegovac, Jun Rao,Eugene J. Shekita, YuanyuanTian, A Comparison of Join Algorithms for Log Processing in MapReduce, SIGMOD‟10, June 6–11, 2010, Indianapolis, Indiana, USA. +[11] Tyson Condie, Neil Conway, Peter Alvaro, Joseph M. Hellerstein,JohnGerth, Justin Talbot,KhaledElmeleegy, Russell Sears, Online Aggregation and Continuous Query support in +International Conference on Cloud, Big Data and Trust 2013, Nov 13-15, RGPV +276 +MapReduce, SIGMOD‟10, June 6–11, 2010, Indianapolis, Indiana, USA. +[12] J. Dean and S. Ghemawat, “MapReduce: Simplified data processing on large clusters,” in USENIXSymposium on Operating Systems Design and Implementation, San Francisco, CA, Dec. 2004, pp. 137–150. +[13] S. Ghemawat, H. Gobioff, and S. Leung, “The Google File System.” in ACM Symposium on Operating Systems Principles, Lake George, NY, Oct 2003, pp. 29 – 43. +[14] HADOOP-3759: Provide ability to run memory intensive jobs without affecting other running tasks on the nodes. https://issues.apache.org/jira/browse/HADOOP-3759 +[15] VinayakBorkar, Michael J. Carey, Chen Li, Inside “Big Data Management”:Ogres, Onions, or Parfaits?, EDBT/ICDT 2012 Joint Conference Berlin, Germany,2012 ACM 2012, pp 3-14. +[16] GrzegorzMalewicz, Matthew H. Austern, Aart J. C. Bik, James C.Dehnert, Ilan Horn, NatyLeiser, and GrzegorzCzajkowski,Pregel: A System for Large-Scale Graph Processing, SIGMOD‟10, June 6–11, 2010, pp 135-145. +[17] Hadoop,“PoweredbyHadoop,”http://wiki.apache.org/hadoop/PoweredBy. +[18] PIGTutorial,YahooInc., http://developer.yahoo.com/hadoop/tutorial/pigtutorial.html +[19] Apache: Apache Hadoop, http://hadoop.apache.org +[20] Apache Hive, http://hive.apache.org/ +[21] Apache Giraph Project, http://giraph.apache.org/ +[22] Mahout, http://lucene.apache.org/mahout/ +[23] Amazon Simple Storage Service (Amazon S3). http://aws.amazon.com/s3/ +[24] Windows.Azure.Storage.http://www.microsoft.com/windowsazure/features/storage/ +[25] The Age of Big Data. Steve Lohr. New York Times, Feb 11, 2012. http://www.nytimes.com/2012/02/12/sunday-review/big-datas-impact-in-the-world.html +[26] Information System & Management, ISM Book, 1st Edition 2010, EMC2, Wiley Publishing +[27] Dryad - Microsoft Research, http://research.microsoft.com/en-us/projects/dryad/ +[28] IBM-What.is.Jaql, www.ibm.com/software/data/infosphere/hadoop/jaql/ View publication stats \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Analysis Challenges and Solutions.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..039b248ff187b904751eb0062c2edc367965f076 GIT binary patch literal 89088 zcmeFa2bdhi6}H}L?bIv*E zXrcj=GsYxiFeV3s$zV*hf%|=@s!nx{N(5iq_qqS`!_%5Qr@P)hb*k!A=<1oLpIZL) z3xBiP8%foFn8AIm9l^Sct9INA41IL;;*20nESR2PWIM&6n9**^KY=C1! z9KCV$!LbpJjdAqF(GN#|90PC+#8Hc*4#yxIgK-SOF%-uz9K&&pz%dfXCO9_5u^Eod zacqHO6pqn2#^4x>V;qk0I40njh+|6}lW=T>V{07S;FyeK3XW}YOvSMsj%hfiFJdS!C4LBNc6mT@*XvWckqljZq9Bdh_ zINETu<0#?iz_AyOP8?+%6&zhS=HQr%V{aU6&HLck7sq}$evM;)90%Yy5J!(CP>PE! zn*4FOCl;qKSoUuu-I5!+--mybxe{kuYL>0pW#rxKvhff0 zEqEVo#c6PM*0e(7uGvdcG)y!lcS-+&0Rtj1>!abO)z^e1bKwxQEVQBBd4r8oXOR_q zi`-`uE3VUT9oVyb?@_zs4t>!q(Li_aolUh->XU4g2G?(fri1tKZnwo2 z{)U6m{?X#~hAy?cr%fui_32)hh?FE>`~Y|8fA^-;vyesq4|n3n^{j8P>ldacHFo{~ z$@&^rJN?i3b7SL&uiXi!@3Rnn--YNmT8O^K0{WA?bx)R?zsL{#Tz>vy^0~tN?(*4l z{^IhP%unRA*Zf6)*hAvLp@=RgG1Q_JPH!m`Dg%!}k645Mud9*I?kl5V+2D};D@oIL z&?%nMU1H|6!d|;i8i$T?da0|kp|JbdQhP(8qXNZ@d}ni^;uPp6N0-Z`hGM=_EVWZx zDYRG6sZJ}j8r6(>9R+l>Azw4yUNA(=CoXDs-z92wvMg} z#e92X+L*6&wWV#vb}Hr+3v<(s&eEQRh6)UBN7}`gORaEPsl5#UwKo+y3#fK!N4}%bnckK*78(j|_4u=H zVC|svzvk=3F*Gps7`1z;KA6Qq~yP)(#BXz)(a%TN6&JJ>a-PN4~SdJNC!)PI?!F!s!h~iIE$m+B9#YJayTi3^NHHFh-~4QJyv0h|SZr!4HgvUC zQdZ|m3;H|`P*A!2FrwJr)R`|=I=dQp>$FlzQF!@g88;2XGQf<^d}EP)CrT2z%G=XY zMf;|6^PPnjSjgJJ3V@_Co=MB|P@&t_L_<&Hu_ z5w@nr1Mnut0)=#3S78nJH-)t7LNHMf(`pCes#Xpmk!NJ4SdYP+X; zB|$AlT$A%1DQ1pc4TTlZ(&#Ew`ikZO9X6UQU59M&FY)4n*Et*N5L>d|8aHP0^t8g^ zWD)JVPlnOZnlG1`T^Ue{;~HAK;4o=rr6y$NM=y~a492K=PQJ6q`q5TE=iRs}JcXeI zLJ69F>V~3boP+$c?(qhF{bgZ#$=?Dg;RZ`Z{v3b7gksYW{0mQ^o-(wd+BO#U#vNCJ zuQ5h#EAC@5tWH5ok;;muVJa=%Txvq`>m|tL#PL(cPaD0>q@86vEH@h3D_eZt%K*x- z4%sbNx*E~WDsufW_-5$#(u7)WCz~`M5uX{7TAgvH@#r8v;?W@h=z!bD7Hcw zm8Aibf!Qf4S|Q(N2H}`?|3tFX-y?16EVUhum9udZrl*tor<114n6~Y>?ZMl z)t+}1k0C_Eb++E*|6QA^@AMS}@{^|i!uH+xvw%NRd5n*Ks<6g}xym}QDu+K7jAX{3!3aZ+ zpWR&1pJu)4?vHM5AthgJl}my7>rZur?$ZBAEg$m>GPyupcb07MbF+!%`Jc+&!W@Hj zyqJgoBTkSp&hV6j9y^e4Onax5s-b(iP{F9z3`_I%t%X&SnpVt{W@FBk;^?RIrWCWJ z3jXI@sRh~s=3JaJ^-NPf$t?8aToOa8O1`0mqa%#Eun4(#x=2!EF2abuvoyDCMz)-x zwEybgxmOYQ#qd+urKUw4oobljr$RCWF77Q}7=bJfADCikuK|`}bp!tvIy*Xx7+J~~ ziC5JP#8q=!O3;;y`xG#~ugvR^0TQP;^?B;C+RE7t%BR$dc9rJqi>;V*VR(w{N?J_b zn0o1?W_37b3|!d^CpC)mI6Yk>h4BQ!@fgx#@P(yE@SwFYv85J|y6UkYY({W0G2#Qn zVi|lGkjKq4N`$|B;~cIM*x44Y_2XX*q%A6+;;yv21Xp0>kD0mLtq%WI=9aJq*@lTH z2aruAEWV<$6xtiPI)WiB&|Mv@m<_nSB;}|a2}|t-B#d0Lb`*y?SdZCBpLA9_INeol zKWN=-!O@?6(>aA!EcN404oc007Nh>uPtF^=3e1UDz?-${uE5r%yY_=YRTUi|I}Md# zt{=s-EJHMAcVgFI6bgKSR?&vyol=^<-8QH@ShcRS<|y4UZn0)7E@@ za~GBjRu&ghEhX91ipd`wifJHVlPYDDnuCcG1`UK}ORfm9Tu|Hj0k3b@g~=H2V10+S z+E_vvbe6iBTf{eY1Jhk=;3OJ3s1_;bqLdI4I!bUhZ|N5NQL4xm9s@MWrFEDFwsBnn z)e;k*av80IWr8KD$~=|`76JI@Y}~O}ZYaTX>B6or7Rr6oc06)vz|6hWhAYd3W=2D( zi;eg!HqA@xIT>fcw-&JkhPsX!q&(K*QcMX;4_pN&QwVmZ@gsV&7i@sVcX8;e7ju}DMQw^ zE!u=OUTo_?IATqb_~A^%>QMHKUlL<76Q`#Q8iGdCP(m;fda-lTDguPSha*d7jn2e)c7qb9 zx$@aqs9;QiZUk%1jb(%suH~8QQVF?mMLX)7^uBTp5*Z!B&O#E&Z8;!7Qac7f2AvUdV`S~IhQ%Q-O6_0s|d+COr68nR_dA!gMwz;R)!o#Bf`$4UUp(F--q zhLPwH5SeVO!6NdQNifV?UTDeB!3rX}9dpTz-HbVr zHNeJxb5qH99X+URj1?G})w{7)%VmSmoglbl{gwGMPlVA2NJ~SWGmY0QSR)geF5Ol` zmK2J-3|mn*hoKk4YPwrqWmvaqe=4O|#ARFQS6UjI(q?piWt5hD%IP6!QE+K&2|La9 z`3TskYj`w+TudyLnh};KaLIMLth*zK;Ze4XxCRf!4Ks7NJxldS>sPU*8hSryco-$A zI@s*{rejNO^=6Yn-*kFQS5p&WAoX~{Bn!Owb0T_YxtisMdV^JUWNcPCEZr5K9T;Np z83_zAEAEonVF!WaF;TEF?`-Gm})_`Xgkc;i8O6Iy^JMtHv#(m5=q?G%N zVBKJe@lgm15f;hXG-?N8n*1qxR7}=UUV=Z-*a1ca#2v75+}hZ0E;{yfW}zMtzAe8e z?JAeM*!J<1&FnOgq`-!XN@>lchSQc5Po+4w;*6^nyDmrInN^ysg$B@wJ&Dxvc~>Jo z+aVR?uL_=Ft^V&Prw4`%#ISvwo7zYj%N7?zaXKBNR%}fuBXgYy{d`))8G-fQkXpE; zQtFTd=zHo5=(XS-j)&noT-9a@rQFrf0>@-joQ-6zh7V>UPxYBxcHya90Z--1(9sK& z@{l?2Oy#K`pW1Qn^E_;(3up`68#Wmu5k;7>uFiHunWnBz34z-D5i#p!B+1EeTahuL zz1Y~@}+eNe_W zVfwma8MD18Lkt)Mi&4KUhy4l0)pCXd1~X%|yGW3aHq5^<7^y{lM-Kpp;6Yn<9-xDK zZm&U`gk$WKt`VuN5^j~$nQImbg2znH%*Q)Gq!^c@0-zaJA;jb%$P6Nj&J&~$K+}^? zG%gdjh6XWUf$L32gs}@N8snPG`xxC&FdcX1<3td+-1MwUr2Kru4mgP@2sQ z{0I@;SH@)tDSFOkC*&In^`+8mmP%K#0!3>}F2y=A_!RO;|g zY&j6%qi0;%oTsA^ei(Hc(3zmNV+xCKjAn zH{FaCIkNYpqh%I|TGhxIE|yIiaa#Z8atca?J}Aw#Nb|6I^&hXmVpAQ`O)YhF!2-QG za|cjRJq5zRXI! zK9$Mw(823TxG}pX^R4~zt<8n{&V0Yt;%pPa;Lk?*59px-)Ai*(+?6l_0y5^xFk5?F z3COiW<^FZ1mmk+TFW(3Sf?%t3vNC-|qr>LAR;-j^Hz2RTju7-Ts1Hspq+#&<@7!++jiTj>F6orQd#CVH5tQu30Jo7FyT{|QV@}YVWjKihjD&`5h+R@#ml`Z zlQ{2_@FS~8ZuN*kzq1RQHf1$&7}s7PmU-9AsI_WPiHgLFSc%N&Ppo3(Evo@_C~{O} zR3udF+7U8plyL|)NKGgGw>c$tWG$?Xj~o>(hwx#+#UNy4jEMFIHaI^~D#fA+J+gpGs{k4 ze##KsP{$dlTIxT^2nQmVLpfw%$1ljK)XpKuNQ-$YA-ke_W0npP(`pP1`tby(Tn*UV zg5d`@Z^@Pwbu7y(KL^VzQZ-S!uCB3)!Eh;MApA8L(2>l|^|lhgg3S4R8BEEV*}{bS zyC4L0gEJ#fg#vxSf)`31#NZtT$w@I+q^Awz0=XUOa)!L+801n;NI!w~4$eQwi}mZU z7Hb!L+QQDN)P#04S!2(FLri)Ti^4y0$%a+HGnq*K%QIE&~E*OjKn4h?=*ZMV+i*XjWs*T%2*Fz z)T~2Kftaa#`212Po@HWRo_$KE>!DaDEb#FX*RCsb3k8{0NIcK%^+PwZz>Q)o{ciI z_e2f#Nl@s*9>UFMlP0F)M$Z_Hetq;dJ58T7J>62bf|`dEQh(9Wpzencqgt?-?$;O-8z z7dT#79DKmgjw0RwLDyI*>@B+mhY!O=W_?F&H>*g)hokw)GgGmQk;iUuX7|L0gftZm z7JEU=6Ia=_JC~0xGf$atAFR1bC>t@5%^QPd`!pCW2*YzM>s4CXkY#u^7*J7p}D%hDAhKnl&_BIA#)h9P>m09j)8}izlv;4o1+?=g`i4IH=T$O4;0s zCTW8Ch{4FGw0Kui>`+l%rCs?35^UuS2C(oTMqgM4#bfIFd3b(p7QE%D35OJ!7Q89k z+m_!4T22|!dCV!|Euh|M9wCsAsOzw%fQ3xc(K0MGw3fOWX;^{Jx6qkeD!a-I7gbI> zS9T+#%}ub3lTLRx89j44ZXs?OhJs)&u?*c}=DWNXIzEhr-GT)25j+(4TOClULK%VD zZ6A*?IXa#^AEASd&Cmnk<@!P+8b61=te)kKGW97lMqpYkAHDthwyoL+Qpm47CK3<= zxPaMqP}4o)y-e2nKp6z6>~clJ#2XfjRQB<4Dr%s$CouONjE`2_3DHfeJ-5TM8e!x!z{I|e ze6dp+ofxO4;10!hjvd1*nJezRH}oOsCt$8w2I7>dQf$M#z%0+pnh8qK4BhMi&Rha# z*ozHkC=4$bo6S;#QE|gO*1gg;?AzxM0*_YE?8~hPD7_aq$Xk`_EeAKoz6or{cQ+nHms=>8Dfn2;_TJpL-`rkC(b>Q7tiYT^6EXK2 zjHrpoRW6vQ#0R^Q3uHnbnZsfEh6b##S6IX4RgK_0g1AEs#rO$6O6{b1bSCH^Qvzf+ znNP(-s18#E*cEFm(emXM%*SCHiq2Mn zQm0&5HxSJs)5%ILDRMK54y)Wu-c0bBHQaG5!!zH!sqZS{sgZ>;>ZR;I?c~3$gzX~e zv9TzOfhUHq+G%4E1M5~OlPUrSm$CE+&_jxg=LgReu;`Wtgd5`;k&4S~ zd>+Q9K3rfUK94216yM3g#k>}Nmx>Gn@Kib9nD6;>Z@X+#^JDzAel91)7n{V)H(nXE zN>bz26sz6f9$A@{#Cl|^gw@5_$Xbm@axW$G+=N_r;S&0Qi}z{3?PbTrrtQrJZruB_y_sHDpbZpN7o?Vkx+V=)><;KsJ7bWHy= zb7Cfz|JZJ3VkzHE(Tt6Jj)TPv4#}t0)^Sftt?UuND6P%dWmQcj}p$mc0Mj-<>3oM8)m`%5rIqpF(5DXm56&OzF71k!ZHlu-k z&_IO#eeixCBbN;6?P3%IoLDlb7U52!I=U)zf3D17=!Z-oFjh)@v(ogyxKge_P-yJr z(+xhVG8b@rDgqN2UPgyzE~_`A#X)rpyL{gsdowWVgp_$=W~>>+LBZaI2E0{=u|GSl z6ulcH+y}AU{EbU_#-!ljs&?RvF`yaq5mx0P>%3AI5L|`8-Zx$W``}c`E6qi2YU_qi z9s{ho2t^_T%Hef=2M!zvcXfc7StmC48v#6Rt<$>nz=W!F$lc~CaK)p zh=9xIr)Ako!9BH%z*XlBVi>d1zZRLX7pLM+dR^KA`axJ_Z<5-2Bt`B8&UvvMi9wM$ zZ^*;pb{+CVwdIT%Q){8ZTnA$?_)Hdp(Dk`zsqEtH4dxW{e8*7o0k1B2Eiz|8z4fo3 zL?Tm$zrjzXareeB$l2>uSPXZn1i92AL z9GKHw9>J0!XCxTS!$$L67FgYA$4iFIm|#zymQHXpTzS5OC&%rLXt+&&B7@-(x8Rmr z@Nzu941S*v zaozf?YJGeNK;ddQ$o`E`!uW_?APt<0>NRFEJY*2=I@N`dLMM7ZF70>nU2whBjG@tq z1tA(iuAix$s8I_`B(Yh7ah8U9>=KyV3`R_+m3@pj1ev#GXFuqDdJd02ZJZb~l$|Yh zU#1p?*{y?`-G~f|Sky?{Y(1#%V|c^fXzZLg$Zfc=2Gj5wzAR-LTZW_F*Gq@Rjg!)2 znLnVPtWPd73xCkF9-3EDSe^Nx1NT5Xk+~(dCH6NRgbd_N1`)R0NJ|#N}(*=Vg@9T+SW(6O06;CkEzK9R2(FbVjLP7UyvsT#Nf9X}i80t$HAxd}${ z-8rn3VK0K@AC{wc_5RhUzf@Agc?@SQDMsLaj)N!=BG8RYn>clcv~Jj7dv8=S#6Mff zhH`PMwTK-Tos9VKb`!pJ$`p*r37=;eKUUWq88MlQ7=aO|xk9@RM_$E#wm`|`W(rIx zQ3vv6jFsI?)w;%3*1|aZCzcOZ@338yS0}`~% zg#g@;1wO&U$wKFtg5 zXb(T)8r04pm3OI2Z|FkFxIR3)?oU#feS}uK!tq6Pp5l)*%!jWc-)Cs!LTy~;SjY~mqOtl8#~RD0ePJc&B}m>qc{-%P#oM9#B{RJ z2=QhfIE|$S1P80P2eDE$?qqAc=oxA?34b_7EE<~%hx9f>VR-Ua#>N_EoY33x;>0nZySs6n4P9-RTdexaO>#miaf zCdQQ-IG-}>MU5CfaNdm!(sA~6171@LCugpiQ0hc1#vU8a4e&Sz!LGsZ%$7M^ov+8! zWwY)EBUtCnwq@BUh_5y&$oO7#lAmE*V722hZtZU4rRRP!V>3lxY#}(_^4s4Qnrqo3ppC*?p(~MF;POD zZYyBbK#IU9?JEuD>Jcbl>_I`%aQ@Elh02V+x)Wty-q8P9Jz7GZ&<ZQB z99LOhRU)xqIA6u%%BM^qV7p!JNBN*O%Zwo%-2@BG)huoHdZo~j4)4Pr zj*U~gE)*Qh!)8Bh{=u$LFnbaXB?0_=|rGgBOrFxe4;N zAloFOS5X}^H-$wel?U@h7YQztICJAzfR7W{YuY=@t0xP)g|!Q-s|#MSkPO-+FvZ-! zc#iecH3fW+OD9H9Wi&4|GWYauINuOyEbg<9ymEz*kmvV2mE{XF4TBT0Qs&(;c*(ud z1F!n=0D?1Ti3RS2=Cp&mEGlL{IbLx?fxA>@ls-VQ}V=ADr{yNfRubb!5$Go*9TRMhy#D2OGef3Wne1O zFw`_W2P{iz$ygo{vW<@@JGpSsT5Mw5#^OR}fqMus7QhYylayUMzXYmapE(cbtHP)a z9oz>Ymy8&QM#gA>NpNQW1BQUC4$ZBldX#Z_9v=90;vtG1kRy;z*69v5W#I;9CEAWM z?4Bev09iJ*Ju2>pF-03pvPswj>r^Kl@}sx>(Ys{)&xh04RRQOqFU7RMylSBt!80B1 z^uVygn#xIE#)u-m0s(t97MdmFvpQ6Dc|C&h8*e9|B?fjn-n`!;)Z!VGj0c z@e6R#+PFi$Z01uVWKz+<=ieB!*bS7dL-uNPrC2nAsa)spg9+K30+z=Yb{$V6AoHn} zyynQq%os?>I!9@PA5Z5mM5|cX4FW@a3geN%@JLlHK}{~OjbQgiy&XA9bVQ*rrlWRA zB(hT^6kA&2xCi|nheWcK6>Yc^6QK-g5>Lv)IL2OhqArVQHleWuk4|)n*{tdqJ-?Q( z5krXPcJy*3>?wgyWS@}K7P{S6X|0rQJY$!>d_7}!?K-xNx#ljzqzLA<7EtIYXuN}G zzpf5*N@T;1=#WQrl$cC0@OPoaSkz`5hf`pi?CUcd_9PvcjPp4GJX)6#B}P?UE;}5t z`o@=Yb@C5JRs(M+k{cq?C^E(%N;rG4{1P{m8Lk`1SJp<4+hO#SvEwI?pE6@Qo?r6o z*3cXp3$hM3lHI=DE>%uvjo1}nyIl!=kL^iNSK-_66(r^i(eg*HffpABH|EuH@RzA= z#yWG3%dMtH7@04ePwgx;<9ieESQvdT3QTK489CYk8A9J|t{#lk=4wO?@vMCv47upQ zE^L=)7+|X%N4XrxBVPu=x4*el)Vw0X2SXg%$wnV+`@*6dI$T`Lxg!vmYG6}%ULt$l zKn`)4mg)|gv?qpfs5$6SILW|bj=Vj`*dtGbSi?;3g@o>+`gsuSHe;-Ypo+LN9I+yU zCWWzy{`QQ{QCVkK3aku}x*eg(OMw zbslySW8);Eg6fPFBcReD5E$4{#)gn%TG3UtEMg->062?cEks2Qk;Dhi18b+|%Z#EKP{*o5< z=2xh*6gah#7?;siO1M)-Hn(RLBo zGe5T;K!ixw1dWAA)zl^5EZSJaV^G?OQ6`+E8B;87(=j1hM+>L!B zHeYhFLv{#oxN00_EEdg5bZd~4$5X%b9OkR#kzItwJiZMRZ64oNv}T%O>p=Cl6|Kc@E3(%~@;XL>?ai0>Vse7BTVnWK zDe+ygX?1nOa28ghEQ zvPYqA&~Q{r6DRRtZXbSM?mp-d3v-JN`{17NbnT!a{qQ_$?WCqG*=Um$+D((!lNz(3 zq*h+5-V@s&_!@PJpSm#{BWm%|wfSP^CzL|^R&~zJi zhyAAG;ZOl@!81f>>Q6_9cx!OoSo|1IIw0kb1Yo_$yyeEPV;(RUYc>dS`F*fhG@uC+ zVtked*!{2r7{d7lD_H$aM>iLKNV;`jA{mF^f-02UfzN~R`2w2r`87#$AKL4YxZlUf z&#llMjElBLxjlyV8EKFwW5xbT|xO^7pF2!dXy7d*&{$9c7e)t@RYrCVj zeFC3niQVBC&RvexLG zB!9){SNOaKjNAI)mwv$5dZQ%iiL@`_^J09?+8DpM1jZqKlVlsDozf4#+JrRM;+#uZK$5(S&qjRq1>>rLSeyc*XDyicJPn__f%Ppu@5kpObxCqOSha(a z+v}kpRGgj>rF_T8-_B+=PCHy1&r;6;}@im_I-Tb zh|m2;U?(;hpWyR0d~P=q=fSuOpNHaetxb~TU3^}S&k~p?ZHixC0&Bu%_|+;fF2?6< ze6F{7l6;8I!6T*Mo8QxFk6YY4#hBdVw@6PCz}u=dt+Q9%;V8=Y9B`I1zb7+KceHCq6ga5_!Sr ziTK@pbWtnye;YyJ|D#AF<_0GiuMJ@75MDH=fv$`4;VA2!FNde9X=nz=N{AXSRIT- zXC%oV@OchC8^M^eJ?aV4zJSm3@i}n^qzB_od|rjm-De_CU_6b_Gw`|pj_^HLui^7@ zeD>HmNuB}g1$>?l#=5hT`u3|yP8eR3d^oly*>u~Q4pIh=H((fda(MstrXF%9MP>3(XATMtrpS!DxyPovw$sYM0DtO7PxM$D&2R|QqlIIN7N9h z1`_L^k-ACyand4?Sm(^S?vPm9jI<~u)-xk528lJyNQ*;a-J(P`YPm|hAM2Aj$NRA+ z)pWzIUfe5Z^}H8r6R%=R@C3H*oQyWiITBc(j6?!+XCzWsuP8Aeo`P=%g~YmP&XK~J zWh7Eqr;L=PF#n#y-3(H7Q6 zBV{S{x2Mp5-j>AzTNV>rSc6GfEU<;;l*NVO{Ia-ESm#MuJfN_AJ%zuwiE_3p`qs-;Two6Z0A)xSADs#z(Hr)zhM{kv~6t-DU!5aaYbo`Y|V+(WBQ*+ZZ$PL?hF6m?G z{C&fm{BA09(@O{&;~WXSl+Y_6FgAF?ibCjXc`FK`pGx#cf0eR1VQlaeZ0Co>JJXJp zgt8GN+Od+_u~J|Mimaw|yWD}KW2PQXiuhoU(`aDLOocwk! z{jr8nFzt~m*AR-cV-2-qjld2@Cr`i^ra|IBm%KHFFiIubF+A;R5`Q*RuuL*L7Bk&aT>d_seShbF^ ztXj8jM91h;eH~*^wT_XfTE{3;tz)dI)-gg<>)0Zzb!@ZMI!1$P9b-bZj*+2S$2ME7 zW1Fnj)kbt|dDYjk{Z;GO_NsNPm(@D9ylNfWU$u_yu3E>|SFK}vs@AbpRqNQcs&$)1 zbZlAG*Ric+b*$qlbh%_a{xuR?!vvKW9Y#T7bV#*Tra`M@ZS@2!J3?~NVQpzoj<>cD zCR+O1L3CjK_7u)*J%zuwZ0w+o>j-5_OIatNutj*vxn)UNDrL*2w@{|* zxomD2H9VzHKqYcVAw@Q2Gb9^cTu3OX(j_7+rJ8F8162q3o&>{jwV**0ura*#UuP8H+t(pb&Pq zgn?p*;|&zT9(pe86Gm@OsSPN#LZKZjpIV{hRmxJ>>OG|{pwtPa9#=3ob()(x$xVah zv3JN}bA>slToKp7rTh6|;`QicZ<_N1ONBA|>2ax_9Hds)hefWqF&Q$_}qkpX3-P&zGTWI$oh z;whU1luZK4CPFD&$|eDY{kx}Z8c;S3D4PnUVkw&j6pjcyWwU^?nNVCAZ6=g1OW7=- za17xon+KH516wv1${b7CJfLvY;VD}Llq~{Vwh+o(OW8sx9B=ntisNlJuI8BAjlA8b z(|EahWX|#SDA2QGAnHa(bYmhq&JwEAa&}Oy<7lc{$1zZ~jw7LJ9mh4*x=9h;RuLV? zBGqX*2C3F@BvP&8xT0Fe9=KY^5kj?&BZF!k#|PCqjti=F?7ORV?3=4~J4AHsnX9j3 zuUoBS-&?I?Pg<>GzgVqfe^{+!FIKH%pH!`5-~&l&}tZw;e@)-Wn)Q=_Cc?2YS9 zx@;t8jrEk#0cCVR87-7~mNHt~6q&5!o-!t&j0sxi7@_QADPsZ(TZN~L4Jcy+%2=W7 zYbj#`3fqyVj0-5^0?Ig{>}M(C0t#E6r;HCM;{(cgq5RrX#s?I(RZp1^P$mSF2}0T5 zQYHixwr)?E7*Hk(#r4?}g>rzUObjTD2cEKJK-n^&Y$=rama=6)VFdA%NdaY2kfTXL zInYuj1r){{PuVJ~x+XR$t zgmQ?bY!grz2|Z>N>+J(rxI5-BIDl%=pQ^OPL|TXqnNvt66-OYRu)7d0)N{1sB9&;z#VR>FIQAY4$Fz2<9!>u|*{yhUoV^F=+3^r{`G~GQ zqHBogI5)56afV*4<2=1u$Ju(djxmURRx#v$Sd*$Ewvjjy$V%97k5`I4Z2xag0~3hCGFP z$#RLKG>R=Z*mRBJli#S6rLfg`3cph=m$-BVq1=co=-GmLwh(xhZ8VqMWa&*p7^xC- zbF)g!%`GZr?O?0+l;(iaEOv~t>6*okTUE+Z7zaG1C7`qjl*En)^&EY2uS!`v7>_-rLnxE&l^sHPNF`Dp zRw+wi1oxD^gi>d(+)F5rKw@t8(%kGNxpBQbP<~ zL2k-I`Mph77CRiJ9F#Eolw9(Jy|N;dKd8jAc~T|X@{~$hTi6SEN|#WcwpVtEEzdxr zPrB46U4c*7XXTP-ZJIek_@hd+<2g&1ql7s^U|eOCW)J5HbA|9HJ(q1abA|A{p3CNh zeWIuA9oVtA@O5&)&63KqwF8#hNBHnIUt}M5Ks;f z%3rN52PlQ(>=apZYuwotZnv`SKHUnp8C$z?xY2SH3kEpvX*8s=+jAcZwH zm%M|2jl?nKyDBkS{S6W$#DN+i4h$j$>$fKyBzC-K34Gte5J*2r2=D8;Y=mHo@RWlC z3g5=?Rvj#q4=m;2AUAA7x#UB8?hv7Tq!K9~tHfyaiAq^p*y=px(13EN*z&1Occ|F% znMzp-+o`7EbuH_buRh4r5`SY&sAb>{sD=E!We6nZ z<|xh0Q9*7Pl|12SA^gh{jutzEPDq}I61K6WFahVc_#~D8I`hjus`vXQv%89C;3i~WiIZY_N?3Jg9Eh|D|Z97eUa$4XM z_HdqXdSJ)tLcq&*QZ}axVP%!FcCb(Mlrx0l>_0;(wBro5siWqL2fwGz&i}~-1$P83>|%WzEIrU>3pGVpjSFuIL2OG#@KEoZARH< zjy3)Q=zMFqAZQI21g+r$X$>3N)^I`4rdVS=22?Dkx=@m#5l8&N~CZ^ZPH~aY!!IV$6k4{Q20JGue?}n!OPZGB4t-g zxj4uX+mWYSB9#6%-6cX9pb{xAW?T|b*z!E(QlSjA=`IyYEhI+HOEq#{Dg=ZVv61Z* z@B7#^mkGi7@-iU|(sQ(9uu558=pUFqN{lFnZuEAbajgp^Q+8r94t4=4ca@vJ}P}Pq`|fTqU+R%2i^^rj~M5kRwJY zPq|tso7pR`7Ru(3SUy*4`CJ{859669Tq6X$EH7nujS^V*t`Wj0J(tZ5BcP{T8&Iwl zinHokp^UbaYlGY{W_rqX0p+@Ya-C4dSju$)g;Ca1t`8{J2RXW4DEP_($?f$4g>l(a zZV*Zxbo9gxLg@*Kp1naRMo*s%wpTHV|o!ROQu`;Z-p>JC6@5^D$$M|RLc5;y{V_%E)IvvaBY_(4Ntfy$jLow19|rdVGnEHJ?hcy7&}~8PZagL7P_I(9U9-k|%6&nbx-V!`_X(xJQts0>#rv_2 z<835+?tY;ZRH7|SkQg2A*S3AX5E`t-Y!RODfDoE3;Q_IuMI}b5qDtA^unl?2gF$z-B*rGkkeHjNG&fHL zUS$mSgr|jYkR?1Vb~xVCLO58@Wpl%*?J3U$lxKuOJ81tiLODdGEQN92Q=S#dq4vsW zg>o1q=H^+=&9gyn*em3c!)=;B3gHNq=#L{+V%Z#}Qq~UkBcAeHKzUB=INGLrPV6{F zr7VR#PcAvup8Jzfj#G)Y9Ip~>aWnlt1trYB%2S>XD9?*6Cs@k!V#|ptWo=>amP<~u z=Uxzs%fkyo*#uXxd|nXB$$Dj$LJK|R&q6uHUioLC(7P<3KWq8?IVd0Yp1I^yo90C! zoTd_ea=InFsDu{-0{dF*eYR=-B7`$lBH=8R=+(1T%I1Wtilnd;YuL$Krm6)T8RLa`IF@vYP z8c<#p%EdO_t76L~DrG4gWq8VKLUGaYHKAOJbS&Z5w0vHZ+%P(FY~2f;pxKMW^ME7NP^Du#d>y)6a+z%v%44lsAQPt-bP1pM8FC<+t|Acf^+4Au(FL zqtWV}pf_R5_Jnr>JKhz-9hUd55bjhdYX@Tib}8F)e-p}GDls>AtHj*gqf(Z_=;0~v z3FTgU<$GcaDa_4#nw$56+%VR7!ux?8?+f8R%X?o4_p6k(gVD)TJ`jqlr5_080h{gv zp**Nkmcn@EDIW%u4~6oOP4}Tt9#$z!VFdJ)j{?d^0p%m1JYp#y1wAZdrl))yP(BWF z^s!JLwUmzo3Zty2d?FNA%AW}3UYqU{p**HiHb;!hp7NO9|LU~K2EQO;DPx&FB{2-LKZMq+X@>i7{#qY&- zE7)#~?Z(zl@5j~dJ;&@79B1S93yiaCBD!u7-69cP_lR!Mh;FfnZt;k2iHNR8M7Lx_ zw^T&8bVRpIM7L~2my76@i|Ce*=vIj6dPa1;BDxhLx|Jfjl_R=UBDz&0y451OUqy7Q zM|5jMbZbU*YgOskx3T{D){vm;VP`gU<{aC%YYj;a+xI(q&b0)kl=UiGwWlmDl+Wyyi%U)lkeHLj)sDr*4mVz54Df^{0y~xv!rv`# z2_by0Qq~Se4NvJ2P)!jb`DNg?cNeZQm-{$cG{QYdaEoKeYB zmJ*6fx0F!mRobzX+Obq%2V)p^m0SAKLikc8mWvyqFD-~NH2 zgz~keEED90ane(k4JgYB3^M zD+r;RN?AMDJ9tXZfYMVaE;l`evWTVh41B`=#8Y|&lwN@?y@b-;QhEgx_CVMHZ_lkL zl*Lq{XBStAo?SwvY>wDxdCE!wWhJrY5$orb0>7*j*uq}UQ&tv=OSiI6df@JCKPwA` z<+HL7T=}q1^n_IcJ62Hw)2$+eC2ek23G84miZZw7Ru#(C&@tVrLYbfveX_J(ne_?# zUHlG$J-3=rmQ{(K&8bAnaw=sh?5Xi94EEfwgtCH4r1VsYlwK-jDeT)lW%Yovy5z`F zRu{jlXep})e&J}qQ`QJ5YY1f}n{ExEtgKSj7LFf0WlfY74X#ZuM` zY~hH*Q`QP>Su3z*EupMxDQhW(W9{`&as2m-gd^$fy7j{T=4hN_?G)BjuW7Fx(XA8F ztsBv;7tyUB(QOdXZ5Yw@j_CSCbQ?u<8%K0~Bf5SOUH^z~Kt#v#ul8SUL{}Hl4T|Un zM|49Xx}g!>u!wGWL^mR$8yV4U647lM(QOvdZ648WQKe(MVg2*1Aq`qXDy_k_uvA*Z zYPL0`+8Rhjbv2Rd~v} zfi3H5`(|ITu25+Ixesg$L#oqEa!LRsHlxq(nNfW+Kvpt;!~$PHUHevQMX*-!|*Rbp;fHY9AQgbf1% zV}K|07J@6!-eLpeE(yJr&^sV7V&Io4>|Of^VI!4j!^SGn7kyRA`hqdWQ#KMxKYQgy zVn=_KNEx6~mcpon-^H-!HWo^)O0=a85_7Y$=4Rs{H;iGP&{qh9ETOO1F<2$qF+`=T z9gKRO(oZNu?Unrkul7?r`UQ3{MtVYjA@KJ~S)=<4!R4gC68Z-OMpRE25D*3kfu5l+ z1}I@bKwvA!-fMf;fkGIe61_Q6CHi6$m9oBI#P*b0p}1$vwPMGnNJl$r)s9-RgU^_m zU&eP&s1w3w_Fi>D*xVB8lu#GsguQ_$3<`2GNC;b4!XPCK3JB~w@I5Z}u7iazS|$2o zj7szcTPAHEEEG2vWN+gsLxeKcrW+!5kV0P!Q9FhNcCc^4Zg!hys1U}hL^~#^L^~#` zlr0nXW}Y%kC|lYqhlw4NR3c?7m9iA}f1Wa2DDLjVg~Hgt+zi*;442%vnLc~VT(Y&L zj}XE(Dls>cA(1db2_pi3uy6H*kwTba2_wY@7r#a-VPrsHPmEtYuxU0C!c>)LgClIB zgiQhh`)%xQw`n#N!X41D{5KUFrs+9)bGk}dZ?dQNl+6OlWyTyo^xgcfh;DL3 zHzlImHlmvv(QOyeO^fKJM|3kHy6q#n9U{7!5#5dv-A)nR&Jo?Lh;EmNZr6xzw}@`{ zDjnM}>z{88qog(LXlwi^X$?C;Vw4)C5n`0I1lNPHw&s$ZZJNXS)~x+XR$tBsX&`Wt+e!jC`IlStxVum6L_S9MLC})hCk!pD<2( z!j!-#Q-t7nQ-rX$rB4a$U}W`_Z3D`-LYZgNZ7Y<0RLc5? z2YZKHa*#bYT_^{uM9Lv5k#eX?Sql4;TymH_H$y0gt3=8XDv@%eN?8hfAWzvoplmNb zaXaz07oQwuDcc97%swlZ9Bt3-AQYEw2cbAG?I4t6^vbL)?BzUVW?;)qp&V<|%@m4@ zOfv&p*e`m@jsayyp&Vx^I|}7^m9n<5C&l-G+jBb!MrH35|grjY7EG+R-S4D^$wnhAqxh3PN$|3V|I3wWAQ&!S?A1 zO@SRvfgMdkxYF9u6!?QJ+EbbXO0(KQ&ov9>Dobe&D2xG~(h^WwgyMYMB9yBwr6r&+ zYG4PxJy#UUwJNcm+=VM>OHnA->A9?D8D~6Y&w#S0*mAv1x2I5UP$^4cWb%~R0cEyO zeq+EtHd1L0*SS)RVd6`Yf#FJeAtU`)3gcUHkC;565Gyi z^<35t#!7sDxINb{lsi-+6AH3C$|ej{8)~+QI1UDSHK!y`*e7Po*#S5MVN*PbmwpW4FQ?5DZeFUSo? z0J-E(mi}uYJg*YVvm?55BD!-Uy7MBs^Q&}hH>`iyZEfrLd}$4@s>D|L8YH&L z`PwSy2d$E|)e{aB!t0iBptL6vc&`J6@PnQI5@E5U?I4C9V~>mE&X7jxTjofKb~@kQ2uJKJVYq(sKglK`kzAr3R@h$bK72d zs8If<621B>NX*Tlnwvv|+^~Im!eK&q&k_z3JKk4`c6^{x)~jsMo^rTQT)M-B@}W(4 zxY+TLN?8hHfTtW0P>v7^bHh?RLMR`rl%+6gc*>Ch z+-T=0^$R_FlzR54z_W}>o^Z4foM(>~g5w=6gioyvN_{$VM{iY;HLl=UoQCBBQ?o;yw`U#Ub}zE+90e4|p9!szNL z#|M<-#TG|7UTpc+QjQOD#CYr}CkW-A_R15K!tyym%jblkd>Fm4TiK>LQ3&6u#N2$Z z5_9u|O4-~n-h0YPHQ)X4!w&~xK7KHcLvS35<1ieD<2VAxkvNXRaWsx&a2$){I2_00 zI046rI8MTGGLBPloQmT#9H-+r1IL*-&cbmvj&pFFi{m^T=i|5l$Avg9!f`QaC{GY|L=eQIS=riB3Fw}l6r_2>m+8KB=r#gSSeeJI70BX z=;WX-o-7ns7f%*SH%mD=XcHV$c*-e4S;Ss>O3)@w(Kc~P&?Yzn@q|+YJ5CjXrwhUHP8Y(W){fHyJ2)otlrsX# z8EOanlQV>}n5CQ%P&kUhI|ugMnL=4YCB_NYx1A}J9(pcY!W?&b%2@&BEU{&PjW1^j zWl2jpE3kzlHBUJ^pqwp~rEI#hg|f6tSz9=^!+QYs+&MzI0kMFdI7cYU>N!TfoJv^= zM}v4rz@9r-D9fuvzqql-xnc|H=LV(Bv7;xPCxjI&;XJX!J-;|l3Fid_jx_PUflYJ1 z5Z;E4_c~t)z4RP&;@*8aU%kpXmiZoZ&XmIWl#{b_Eu(WYEqBH|zqkN*uAXCE7|~r6 z(On$TT@uk<8qr-A(On+VT@le;8PQ!8(On(UT@%q=8_``C(On%P@>=H+Xa66vZZam=?a9};c2N(om51V*AyA3fzdp}2I{38g>M(I?lbPp%7m z!f5IV*9Uf7uLN3ky$}XiJFXXstE-H^*tKuZ-5``&mFU?zmFU?)DrIxSh>dSRx95H% zlp!jS;>JtA5nG1pxh#b--cxQAic5E+mPi_o+!XCjBZVK$UNeT4HO+pxM z?YJrM3HuOFxmhS9?3FhQg;vpyo7Ik+13TE`c)~4#9k&R<@oo{qNK3yZu!DUR-g2<# zZWYRs(9!-|g|aEm(T-cyj#~pe*rVl=%`D+IA-Gz0n-HF}yxWAZxn7wq7xsak^4oy& zTcL2wMyq}+6c=fK8{~$)rl;H7B)AxYi@22a>G8>6Yda#d+KqA5MIO;^v4}a zxFaC2N6saqY%cEOGIlovzy+Jmb1I-otB^O;9pK}o?F}tYpTaX_eFH~M|2NFbPq;! z4@GnjM|6)wbdN@Kk41EkM|8iB=$?q^{t(eU8PPoz(LEi}JrmJA8`1qSqGODxE{{J& zbk9e0FGO^Ij_BBOtMBobi0-9`?&XN?m5A=ui0-v29os(ZUoP3kwv>CNHMkk(z0w*c z>p8Z}DJo^#6l<)f+$WT6?UnZ_h0*FhX;ZxOeL=Kh{q}_W13T^)g5%vUgcjRI@7GpI zCR>E3JRlUeTJ?ZXT+DkwC{wMC4+IppA-t1d&pjB}@}N+r={fpjx=LA}u+@3WLjmO> zp}1)Ekk~TAQXUFyVLQcdY}j)T3uOnD7&&LEL|b-LDQgQ`wx>KIl%4FAkBBYw63gci zEuTlkjt0AK!Z_dwj|yRDOL$ZW*V__#R0w;kl(mDA!&4p;$}CHHOeo9^?RZS>cueeY zJJ1+sJmGO6>|zOz3t?AFcw7mO2LwhX{4R%0^Lruet`a@Ehb8=83BL~rjA8ga0Gs9s zA=IlxLW3ndp@b&_0wW&2S>LAlgAfWTk^NExO7j7FWi%cC&i8y zOL;pgbiMH^+WTC@a~LeJY?Z4&xmSdxximvZqSS(QHU8*{9VfPYc1# zY8kchdjK}gGeX$h-s>5$!+mqiGeT(7E3-afocEMx1In{Pp&g7B&kChor7VR#gQxs4 zp!`uNC7bS#Lg`Q`OJQH)DbEFz=K{)eLfOkwo(nw7-p5n^6j1&o6gMvXlTbP>z1-d`iScOtrXBf7subniuU??-eWM06iUbRR`@A4hbb zM0B4wm47uYhcG;g~A?zcKlWC_-kMX+ovbIBLvrryd#8tY%lVT65a_2Y|WnVZjh6A zh2T8;t`PRMIe9n83ERJ?{4JpTE%3+RgtDKd{4Jm`VtC4X0p&fRxH|WqP+ZJ?FQ72S z;O$6zhxdizMyKx!Wq&=#(WzSldq1EsDtXEWLfI8M*1`{ja)70LAhyg`DLYnR9P^Y9 zh2rl1p->J)I+pNxrL<#U2c^z4Z$WqraP$Wy)$%1G!~JH8NG?t(<0e4#%1 zBJc_OD^K`R2=3|LmqIuRcP8OWC44CaHxFX(<_TW~Ir&NmCtKUU62d7eWpl#*&{Mt^ z%Bl9suZ41&O7zF+DrG6`K|SRgp`2l_{6;Cv%{Q8xZvua?zx9M~g}}XD^ys%jxCjyn z-zwqTfWY24mz-(u`cEO8r4mc_Y?YXkb5zRag#9_*GqvabC6vC_j(>?A=jl08&Q~c* z;RwJ}z6&Vd3FQKt?mNlNg(_t!95Z;z_W|X5;}e_id!bycQkKF|2Hv-`=Y9~1o16b2 zluc~@eh|u~dZnXqe7%Z{ug&<`tWsyk(*AGvms`JfpB!(?cb}u5tsW1)(AJMH4(eZgjweNdH zbSp-5tTEMTSB~gbiRf01=vIs9xKFD39;-)mYeaNwMs#ac=@?5A=zMEPx^bVPi@OOb z9e#fZ^`CJj>BjbL(y%4CxXap_OD?yqq(%r=s6>MMuBsX()N~`kjWk%dJ)xTrn1=W2 zCN^AYZRn=#!%0-3ZzNukRp*ZHELb*<_bg_j@woOl2ETAkVl$*PanF|*7s^d~E=yti_mm|9$`WFWE2$-fa!&7<$ zlpX=4hfr>@lpXSV{B0$qB_pft*n8Lppjkr=HD;Ph9(99QK6egy8m$E+>ThEnzt& zEEkjwqqZk3ALL|tAvk|5FN6ndPL>bKhH>6gRuIaA_R1B6@{mgO>cc8!{lT8WQ+f*J z5qo7%%?;~UPqF1uJ(s1hFY%OKL5_L}#g$Djp*&_Oy@DLE_wke!1Img4WksPpZYe7U z6!ur1vQj`{D+%TImaD9S}dKt!BSP(VRZPzF&Pm~Q7G{a^Z}e?-%y?M>&~F`d#h zou@S2&vVvZ`&}pNW0QUC1yGZ$g^xH*Btl4)N3aX4m*=;DhN%^5rc9ZfWwc?1f^>zOJ z>iF(7{*4tizDwWdTk>{P`S;F)H-$A+siW<2v@%C4ceDyet8}y~N2_+U8b_;jw7rg2 z=V8{N*8EJZ7?~Imq9ResNQvh{87Z;eFQYH{J|M&#fEY@Iax81l?p{I4&t)_fhJrXvluARXBqh#lB`I-zDh&mZohVg?Qe`Mrq{Q>L z%203?BuX_YzYwphNx^U7Ae&T^g0WST5N8%AMS744;%FefE*?JGC&1uZ35M@L``4_89_B)$l1*(q}&j z-;`ID`{@H#6>GVlgx~9x*{H)g9G=vbwgaU6K`r?4^>76!2T1v&wq+?exf7*6P+ka-fJ$&9AS_|Zf{98Ht)1Gy?uno0SGc-&0N zKgEw`^`qJNfy|Z&hm9YHN%)uW4(ADKWoH$+Fj0<>68FdvGnyl${97nT%xI83!&A-D zc9fLxahTj&M|CvVX-7#3Z#qj`))(a4L^(#vq^!*`Qo>Ey?-(iXQY%YAhAzszTiTA3 zf>$!Q`*BjHK~7JU7DH(0i$MUEP~BhU+Lp%aeQ>1Zb%?UbW+IofGQJL72Gj`pUb^*GvDN9%R8bB@;MXy+ZR z-_ZsfZP3v!INFe-U39czN4w-`ctu;dzLy>Cilbe1v}=xb-O)xJ?M8uyU5)*hqM^e? zLx+i}4o1TVB&Iqv8bHC04WE!EZ6`?ipjybVm*q@6LCS};EgRq14 z>Ldks?xY{FhC@Uo!buV?$emA;@L{?0NfJJyR@M*1P@-H4Iy+Zq1zB}Vie_yrO%rr>{1Ip>{bi8s6?&oT;PmJ zlpaIrp&yabLqAG|(nDWj<%3fxQO=UmAldaSDSM>fSyIZ>%KCzHEKzz5rI(cW-hMAB zZsFS3(s)2tye3%F32T`GGr)2^ktv)8=^1!)yh(k zeZmu@(sq%Q2DRYJH^LQ|*^4@}7tPEfSB2+HrOz-4@h5!4^rJDffiSFuVG`myt;lTQ zr`;6K5tMe6gtea6w z?`V%4?XjaRINGA4EjikxtI4Su3U)*7wl-I%)i0yHW?Qs%f zZHcxh|9$L&4b|TtlQO0ja`L!ZSqjd_M42^|SwoqnFSmp;Yes|i85y>bA~cUKkf>1&QNg1C(1l2 z({klJDKo*sXy$b^^JX;22;n&a>GOz$`)Xl6l7-RCYFl<~kV6vXF)0t^%E$EMp<1BK zsgm$7au2br@dw^uZIIA|GAy{x;g$o*3YTZwly^B=zLqgo_-lTDXgboIog_|tvlL= zqis6cR)L0{0AGr7Z^=Bow^dVJI7 Read full chapter +Big Data Analytics Challenges and Solutions +In Big Data Analytics for Intelligent Healthcare Management, 2019 +> Read full chapter +Big data principles and paradigm +In Ocean Energy Modeling and Simulation with Big Data, 2020 +> Read full chapter +Extreme Learning Machine and Its Applications +in Big Data Processing +In Big Data Analytics for Sensor-Network Collected Intelligence, 2017 +> Read full chapter +Energy Efficiency in Data Centers and +Clouds +In Advances in Computers, 2016 +> Read full chapter +Climate Analytics as a Service +In Cloud Computing in Ocean and Atmospheric Sciences, 2016 +> Read full chapter +A Deep Dive into NoSQL Databases: +The Use Cases and Applications +In Advances in Computers, 2018 +> Read full chapter +Hadoop in the Cloud to Analyze Climate +Datasets +In Cloud Computing in Ocean and Atmospheric Sciences, 2016 +> Read full chapter +Ocean energy data learning from big +data +In Ocean Energy Modeling and Simulation with Big Data, 2020 +> Read full chapter +Connected Computing Environment +In Advances in Computers, 2013 +> Read full chapter +ScienceDirect is Elsevier’s leading information solution for researchers. +Copyright © 2018 Elsevier B.V. or its licensors or contributors. ScienceDirect ® is a registered trademark of Elsevier B.V. Terms and conditions apply. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Management on Wireless Sensor Networks.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Big Data Management on Wireless Sensor Networks.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..f9484f874a6ec1ea9b327478269900ead4bca34d GIT binary patch literal 4608 zcmeHK&2Jk;6o0$^NJ5)9AEhmUri;@+;+T*GkSd~*I87SmKwCMkKqAOE_L3}d?XccP z$_Z281`-lSxK!fOOMy#~0HNl_p%MrVNSso{KY#=hhqmVToAJhWzElZRiITD2%)Z}y z^WMyxuje1W@7TEVMfWY)QpO}8cPlLtuEUMGZ)q1X!4tb%sZ=Q9H$L~ve<%V;DdOje zCDT$s>&hCJ@}A3K2^s!$8}`Q@76OpnXweEU!MiKVvY^JXyhpE{MV(@9`sX-y*4mDK zT=lpkB}kP#@?C(Ei@LKl`qw z8LJo$$xrP!n-YjS&;Bj!h|h!TYG3>ceqL6%53+XNbF!t}8`ga&lWGhZgM0Iosy_kJ zhW$hYw?67FRez?W-)K!pmW(!I{`qfvPeOw^$;;-1()&QwQB}90Hsnjy=NE;HVCQ}Z z{mNS(@<^bBB;h)l{J$vZ33kIOPDu1bv^U<{JDeUE>-WD0dV}V%<@N6W&0IBFji%wPen1FbpJ#e z9^x_}PqJfuub5Tq60;igPf1*`9QBU$$QyidP<8Ic$7>Fsl|gyB&Y|Di_gU?#+}8SS zs2fS-&kDk^S#DUwxyTCt!x!w0bHDARzZ*`gJLx~jxWR3=S^Rho>Nx!63w(TF7d*ZT z9@_V_JOHVTyJ&kp zfM+sMDiyO%#&e1VqMlvw@Tey3yoOS1D>fe5>D5gBl14@v*-<>xXN#VVotGTNQ<^QV zthvtOl4o7DMu$gET6Vr*SjNPI)@yEw|s}X-`nBi_SN5id~xCYcv|5xg%7Iw zvO>zx@k<}}4qgL!8)pV_>lwBJ?r6^X)n4#b}+aU)*c92?`>%Eq`M7a)OElR1;l zu0?riHkm!~yZV>KhzK#72yMZ5$85!zuWiLR;(F|kik{BZL^Nk0D)gZ_Q^m;V0^n#@ z%Yxu&QF9@1jI-v#;J6B!YXZmr3*=}UGuhA9S_o`f2w=VumCaI%bFW$84G>XT zu9o>0G{-S;k7&-H$ pair&AGGREGATION +job&different type&AGGREGATION +MapReduce framework&framework&GENERALIZATION +framework&input&依赖 +MapReduce framework&< key&依赖 +framework&set&依赖 +framework&input&依赖 +output&job&AGGREGATION +framework&< key , value > pair&依赖 +key&framework&依赖 +key class&Writable-Comparable interface&实现 +Input and Output type&a mapreduce job − ( input )&AGGREGATION +Input and Output type&v3 > ( output )&依赖 +Input and Output type&v2 > → reduce → < k3&依赖 +core&job&AGGREGATION +Input Output Map < k1 and v1 > list ( and < k2 , v2 > ) reduce&Map&实现 +Input Output Map < k1 and v1 > list ( and < k2 , v2 > ) reduce&Map&实现 +Input Output Map < k1 and v1 > list ( and < k2 , v2 > ) reduce&Map&实现 +Mapper − Mapper&set&依赖 +Mapper − Mapper&input key/value pair&依赖 +set&intermediate key/value pair&AGGREGATION +Mapper − Mapper&intermediate key/value pair&依赖 +namednode − node&file system ( hdf )&依赖 +datum&advance&依赖 +datanode − node&datanode − node&依赖 +processing&place&依赖 +masternode − node&masternode − node&依赖 +slavenode − node&slavenode − node&依赖 +jobtracker − schedules job&jobtracker − schedules job&依赖 +Task Tracker −&task and report status&依赖 +Task Tracker −&JobTracker&依赖 +program&dataset&依赖 +program&dataset&依赖 +program&Mapper and Reducer&依赖 +execution&Mapper and Reducer&AGGREGATION +task −&Mapper&依赖 +task −&Mapper&依赖 +task −&execution&依赖 +task −&Mapper&依赖 +task −&Mapper&依赖 +task −&execution&依赖 +task −&execution&依赖 +task −&execution&依赖 +task −&execution&依赖 +task −&Mapper&依赖 +task −&execution&依赖 +task −&Mapper&依赖 +task −&execution&依赖 +task −&execution&依赖 +task −&Mapper&依赖 +task −&execution&依赖 +task −&Mapper&依赖 +task −&Mapper&依赖 +execution&Mapper&AGGREGATION +slice&datum&AGGREGATION +task attempt −&particular instance&依赖 +task attempt −&an attempt&AGGREGATION +electrical consumption&organization&AGGREGATION +It&monthly electrical consumption&依赖 +we&application&依赖 +above datum&input&依赖 +year&maximum usage and year&AGGREGATION +year&minimum usage&AGGREGATION +finite number&record&AGGREGATION +They&required output&依赖 +They&logic&依赖 +electrical consumption&largescale industry&AGGREGATION +largescale industry&particular state&AGGREGATION +its&formation& +we&such bulk datum&依赖 +They&time&依赖 +They&lot&依赖 +lot&time&AGGREGATION +we&datum&依赖 +we&source&依赖 +we&network server&依赖 +we&MapReduce framework&依赖 +1979 23 23 2 43 24 25 26 26 26 26 25 26 25 1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34 1984 39 38 39 39 39 41 42 43 40 39 38 38 40 1985 38 39 39 39 39 41 41 41 00 40 39 39 45 Example Program&MapReduce framework&依赖 +1979 23 23 2 43 24 25 26 26 26 26 25 26 25 1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34 1984 39 38 39 39 39 41 42 43 40 39 38 38 40 1985 38 39 39 39 39 41 41 41 00 40 39 39 45 Example Program&sample datum&依赖 +1979 23 23 2 43 24 25 26 26 26 26 25 26 25 1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34 1984 39 38 39 39 39 41 42 43 40 39 38 38 40 1985 38 39 39 39 39 41 41 41 00 40 39 39 45 Example Program&sample datum&依赖 +1979 23 23 2 43 24 25 26 26 26 26 25 26 25 1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34 1984 39 38 39 39 39 41 42 43 40 39 38 38 40 1985 38 39 39 39 39 41 41 41 00 40 39 39 45 Example Program&MapReduce framework&依赖 +/ / Reducer class public static class E_EReduce extends MapReduceBase&IntWritable > {&实现 +/ / Reducer class public static class E_EReduce extends MapReduceBase&Reducer < Text and IntWritable and Text&实现 +compilation and execution&program&AGGREGATION +home directory&Hadoop user&AGGREGATION +Compilation and Execution&Process Units Program&AGGREGATION +we&Hadoop user&依赖 +we&home/hadoop )&依赖 +Step 1&directory&依赖 +Step 1&compiled java class&依赖 +Step 1&compiled java class&依赖 +Step 1&directory&依赖 +$ mkdir unit&2 Download Hadoop-core-1.2.1.jar&依赖 +follow link mvnrepository.com&jar&依赖 +input_dir step&5&依赖 +input directory&hdf&AGGREGATION +$ HADOOP_HOME / bin/hadoop jar units.jar hadoop.ProcessUnits&while&依赖 +$ HADOOP_HOME / bin/hadoop jar units.jar hadoop.ProcessUnits&Wait&依赖 +output&number&依赖 +output&number&依赖 +output&input split&依赖 +number&input split&AGGREGATION +number&Map task&AGGREGATION +output&input split&依赖 +number&reducer task&AGGREGATION +FILE&large read operation&AGGREGATION +Number&write operation&AGGREGATION +Number&byte&AGGREGATION +Number&read operation&AGGREGATION +Number&large read operation&AGGREGATION +File&Counters& +file&hdf&依赖 +Hadoop command&$ HADOOP_HOME / bin/hadoop command&依赖 +cat output_dir / part-00000 / bin/hadoop df&output_dir / home/hadoop Important command&依赖 +table&option&依赖 +their&description& +20 distcp &20 distcp &依赖 +class path&Hadoop jar&依赖 +Hadoop jar&jar&GENERALIZATION +events&details& +- list&job&依赖 +Killed task&failed attempt&依赖 +Failed task&failed attempt&依赖 +priority&job&AGGREGATION +history&bin/hadoop job&AGGREGATION +status&bin/hadoop job&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt new file mode 100644 index 0000000..b0b2902 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt @@ -0,0 +1,469 @@ +MapReduce is a framework using which we can write applications to process huge amounts of data, in parallel, on large clusters of commodity hardware in a reliable manner. + +What is MapReduce? +MapReduce is a processing technique and a program model for distributed computing based on java. The MapReduce algorithm contains two important tasks, namely Map and Reduce. Map takes a set of data and converts it into another set of data, where individual elements are broken down into tuples (key/value pairs). Secondly, reduce task, which takes the output from a map as an input and combines those data tuples into a smaller set of tuples. As the sequence of the name MapReduce implies, the reduce task is always performed after the map job. + +The major advantage of MapReduce is that it is easy to scale data processing over multiple computing nodes. Under the MapReduce model, the data processing primitives are called mappers and reducers. Decomposing a data processing application into mappers and reducers is sometimes nontrivial. But, once we write an application in the MapReduce form, scaling the application to run over hundreds, thousands, or even tens of thousands of machines in a cluster is merely a configuration change. This simple scalability is what has attracted many programmers to use the MapReduce model. + +The Algorithm +Generally MapReduce paradigm is based on sending the computer to where the data resides! + +MapReduce program executes in three stages, namely map stage, shuffle stage, and reduce stage. + +Map stage − The map or mapper’s job is to process the input data. Generally the input data is in the form of file or directory and is stored in the Hadoop file system (HDFS). The input file is passed to the mapper function line by line. The mapper processes the data and creates several small chunks of data. + +Reduce stage − This stage is the combination of the Shuffle stage and the Reduce stage. The Reducer’s job is to process the data that comes from the mapper. After processing, it produces a new set of output, which will be stored in the HDFS. + +During a MapReduce job, Hadoop sends the Map and Reduce tasks to the appropriate servers in the cluster. + +The framework manages all the details of data-passing such as issuing tasks, verifying task completion, and copying data around the cluster between the nodes. + +Most of the computing takes place on nodes with data on local disks that reduces the network traffic. + +After completion of the given tasks, the cluster collects and reduces the data to form an appropriate result, and sends it back to the Hadoop server. + +MapReduce Algorithm +Inputs and Outputs (Java Perspective) +The MapReduce framework operates on pairs, that is, the framework views the input to the job as a set of pairs and produces a set of pairs as the output of the job, conceivably of different types. + +The key and the value classes should be in serialized manner by the framework and hence, need to implement the Writable interface. Additionally, the key classes have to implement the Writable-Comparable interface to facilitate sorting by the framework. Input and Output types of a MapReduce job − (Input) → map → → reduce → (Output). + +Input Output +Map list () +Reduce list () +Terminology +PayLoad − Applications implement the Map and the Reduce functions, and form the core of the job. + +Mapper − Mapper maps the input key/value pairs to a set of intermediate key/value pair. + +NamedNode − Node that manages the Hadoop Distributed File System (HDFS). + +DataNode − Node where data is presented in advance before any processing takes place. + +MasterNode − Node where JobTracker runs and which accepts job requests from clients. + +SlaveNode − Node where Map and Reduce program runs. + +JobTracker − Schedules jobs and tracks the assign jobs to Task tracker. + +Task Tracker − Tracks the task and reports status to JobTracker. + +Job − A program is an execution of a Mapper and Reducer across a dataset. + +Task − An execution of a Mapper or a Reducer on a slice of data. + +Task Attempt − A particular instance of an attempt to execute a task on a SlaveNode. + +Example Scenario +Given below is the data regarding the electrical consumption of an organization. It contains the monthly electrical consumption and the annual average for various years. + +Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Avg +1979 23 23 2 43 24 25 26 26 26 26 25 26 25 +1980 26 27 28 28 28 30 31 31 31 30 30 30 29 +1981 31 32 32 32 33 34 35 36 36 34 34 34 34 +1984 39 38 39 39 39 41 42 43 40 39 38 38 40 +1985 38 39 39 39 39 41 41 41 00 40 39 39 45 +If the above data is given as input, we have to write applications to process it and produce results such as finding the year of maximum usage, year of minimum usage, and so on. This is a walkover for the programmers with finite number of records. They will simply write the logic to produce the required output, and pass the data to the application written. + +But, think of the data representing the electrical consumption of all the largescale industries of a particular state, since its formation. + +When we write applications to process such bulk data, + +They will take a lot of time to execute. + +There will be a heavy network traffic when we move data from source to network server and so on. + +To solve these problems, we have the MapReduce framework. + +Input Data +The above data is saved as sample.txtand given as input. The input file looks as shown below. + +1979 23 23 2 43 24 25 26 26 26 26 25 26 25 +1980 26 27 28 28 28 30 31 31 31 30 30 30 29 +1981 31 32 32 32 33 34 35 36 36 34 34 34 34 +1984 39 38 39 39 39 41 42 43 40 39 38 38 40 +1985 38 39 39 39 39 41 41 41 00 40 39 39 45 +Example Program +Given below is the program to the sample data using MapReduce framework. + +package hadoop; + +import java.util.*; + +import java.io.IOException; +import java.io.IOException; + +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.conf.*; +import org.apache.hadoop.io.*; +import org.apache.hadoop.mapred.*; +import org.apache.hadoop.util.*; + +public class ProcessUnits { + //Mapper class + public static class E_EMapper extends MapReduceBase implements + Mapper /*Output value Type*/ + { + //Map function + public void map(LongWritable key, Text value, + OutputCollector output, + + Reporter reporter) throws IOException { + String line = value.toString(); + String lasttoken = null; + StringTokenizer s = new StringTokenizer(line,"\t"); + String year = s.nextToken(); + + while(s.hasMoreTokens()) { + lasttoken = s.nextToken(); + } + int avgprice = Integer.parseInt(lasttoken); + output.collect(new Text(year), new IntWritable(avgprice)); + } + } + + //Reducer class + public static class E_EReduce extends MapReduceBase implements Reducer< Text, IntWritable, Text, IntWritable > { + + //Reduce function + public void reduce( Text key, Iterator values, + OutputCollector output, Reporter reporter) throws IOException { + int maxavg = 30; + int val = Integer.MIN_VALUE; + + while (values.hasNext()) { + if((val = values.next().get())>maxavg) { + output.collect(key, new IntWritable(val)); + } + } + } + } + + //Main function + public static void main(String args[])throws Exception { + JobConf conf = new JobConf(ProcessUnits.class); + + conf.setJobName("max_eletricityunits"); + conf.setOutputKeyClass(Text.class); + conf.setOutputValueClass(IntWritable.class); + conf.setMapperClass(E_EMapper.class); + conf.setCombinerClass(E_EReduce.class); + conf.setReducerClass(E_EReduce.class); + conf.setInputFormat(TextInputFormat.class); + conf.setOutputFormat(TextOutputFormat.class); + + FileInputFormat.setInputPaths(conf, new Path(args[0])); + FileOutputFormat.setOutputPath(conf, new Path(args[1])); + + JobClient.runJob(conf); + } +} +Save the above program as ProcessUnits.java. The compilation and execution of the program is explained below. + +Compilation and Execution of Process Units Program +Let us assume we are in the home directory of a Hadoop user (e.g. /home/hadoop). + +Follow the steps given below to compile and execute the above program. + +Step 1 +The following command is to create a directory to store the compiled java classes. + +$ mkdir units +Step 2 +Download Hadoop-core-1.2.1.jar, which is used to compile and execute the MapReduce program. Visit the following link mvnrepository.com to download the jar. Let us assume the downloaded folder is /home/hadoop/. + +Step 3 +The following commands are used for compiling the ProcessUnits.java program and creating a jar for the program. + +$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java +$ jar -cvf units.jar -C units/ . +Step 4 +The following command is used to create an input directory in HDFS. + +$HADOOP_HOME/bin/hadoop fs -mkdir input_dir +Step 5 +The following command is used to copy the input file named sample.txtin the input directory of HDFS. + +$HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir +Step 6 +The following command is used to verify the files in the input directory. + +$HADOOP_HOME/bin/hadoop fs -ls input_dir/ +Step 7 +The following command is used to run the Eleunit_max application by taking the input files from the input directory. + +$HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir +Wait for a while until the file is executed. After execution, as shown below, the output will contain the number of input splits, the number of Map tasks, the number of reducer tasks, etc. + +INFO mapreduce.Job: Job job_1414748220717_0002 +completed successfully +14/10/31 06:02:52 +INFO mapreduce.Job: Counters: 49 + File System Counters + +FILE: Number of bytes read = 61 +FILE: Number of bytes written = 279400 +FILE: Number of read operations = 0 +FILE: Number of large read operations = 0 +FILE: Number of write operations = 0 +HDFS: Number of bytes read = 546 +HDFS: Number of bytes written = 40 +HDFS: Number of read operations = 9 +HDFS: Number of large read operations = 0 +HDFS: Number of write operations = 2 Job Counters + + + Launched map tasks = 2 + Launched reduce tasks = 1 + Data-local map tasks = 2 + Total time spent by all maps in occupied slots (ms) = 146137 + Total time spent by all reduces in occupied slots (ms) = 441 + Total time spent by all map tasks (ms) = 14613 + Total time spent by all reduce tasks (ms) = 44120 + Total vcore-seconds taken by all map tasks = 146137 + Total vcore-seconds taken by all reduce tasks = 44120 + Total megabyte-seconds taken by all map tasks = 149644288 + Total megabyte-seconds taken by all reduce tasks = 45178880 + +Map-Reduce Framework + + Map input records = 5 + Map output records = 5 + Map output bytes = 45 + Map output materialized bytes = 67 + Input split bytes = 208 + Combine input records = 5 + Combine output records = 5 + Reduce input groups = 5 + Reduce shuffle bytes = 6 + Reduce input records = 5 + Reduce output records = 5 + Spilled Records = 10 + Shuffled Maps = 2 + Failed Shuffles = 0 + Merged Map outputs = 2 + GC time elapsed (ms) = 948 + CPU time spent (ms) = 5160 + Physical memory (bytes) snapshot = 47749120 + Virtual memory (bytes) snapshot = 2899349504 + Total committed heap usage (bytes) = 277684224 + +File Output Format Counters + + Bytes Written = 40 +Step 8 +The following command is used to verify the resultant files in the output folder. + +$HADOOP_HOME/bin/hadoop fs -ls output_dir/ +Step 9 +The following command is used to see the output in Part-00000 file. This file is generated by HDFS. + +$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000 +Below is the output generated by the MapReduce program. + +1981 34 +1984 40 +1985 45 +Step 10 +The following command is used to copy the output folder from HDFS to the local file system for analyzing. + +$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/hadoop +Important Commands +All Hadoop commands are invoked by the $HADOOP_HOME/bin/hadoop command. Running the Hadoop script without any arguments prints the description for all commands. + +Usage − hadoop [--config confdir] COMMAND + +The following table lists the options available and their description. + +Sr.No. Option & Description +1 +namenode -format + +Formats the DFS filesystem. + +2 +secondarynamenode + +Runs the DFS secondary namenode. + +3 +namenode + +Runs the DFS namenode. + +4 +datanode + +Runs a DFS datanode. + +5 +dfsadmin + +Runs a DFS admin client. + +6 +mradmin + +Runs a Map-Reduce admin client. + +7 +fsck + +Runs a DFS filesystem checking utility. + +8 +fs + +Runs a generic filesystem user client. + +9 +balancer + +Runs a cluster balancing utility. + +10 +oiv + +Applies the offline fsimage viewer to an fsimage. + +11 +fetchdt + +Fetches a delegation token from the NameNode. + +12 +jobtracker + +Runs the MapReduce job Tracker node. + +13 +pipes + +Runs a Pipes job. + +14 +tasktracker + +Runs a MapReduce task Tracker node. + +15 +historyserver + +Runs job history servers as a standalone daemon. + +16 +job + +Manipulates the MapReduce jobs. + +17 +queue + +Gets information regarding JobQueues. + +18 +version + +Prints the version. + +19 +jar + +Runs a jar file. + +20 +distcp + +Copies file or directories recursively. + +21 +distcp2 + +DistCp version 2. + +22 +archive -archiveName NAME -p * + +Creates a hadoop archive. + +23 +classpath + +Prints the class path needed to get the Hadoop jar and the required libraries. + +24 +daemonlog + +Get/Set the log level for each daemon + +How to Interact with MapReduce Jobs +Usage − hadoop job [GENERIC_OPTIONS] + +The following are the Generic Options available in a Hadoop job. + +Sr.No. GENERIC_OPTION & Description +1 +-submit + +Submits the job. + +2 +-status + +Prints the map and reduce completion percentage and all job counters. + +3 +-counter + +Prints the counter value. + +4 +-kill + +Kills the job. + +5 +-events <#-of-events> + +Prints the events' details received by jobtracker for the given range. + +6 +-history [all] - history < jobOutputDir> + +Prints job details, failed and killed tip details. More details about the job such as successful tasks and task attempts made for each task can be viewed by specifying the [all] option. + +7 +-list[all] + +Displays all jobs. -list displays only jobs which are yet to complete. + +8 +-kill-task + +Kills the task. Killed tasks are NOT counted against failed attempts. + +9 +-fail-task + +Fails the task. Failed tasks are counted against failed attempts. + +10 +-set-priority + +Changes the priority of the job. Allowed priority values are VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW + +To see the status of job +$ $HADOOP_HOME/bin/hadoop job -status +e.g. +$ $HADOOP_HOME/bin/hadoop job -status job_201310191043_0004 +To see the history of job output-dir +$ $HADOOP_HOME/bin/hadoop job -history +e.g. +$ $HADOOP_HOME/bin/hadoop job -history /user/expert/output +To kill the job +$ $HADOOP_HOME/bin/hadoop job -kill +e.g. +$ $HADOOP_HOME/bin/hadoop job -kill job_201310191043_0004 \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop - MapReduce.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..412406ce0d8413362275e906413495ce1ebadd88 GIT binary patch literal 27648 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 L-{kx?_P~DufF=h5 literal 0 HcmV?d00001 diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce-relation.txt" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce-relation.txt" new file mode 100644 index 0000000..739e1aa --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce-relation.txt" @@ -0,0 +1,346 @@ +Hadoop Architecture&Big Data Course !!&依赖 +your&career& +Hadoop Architecture&Big Data Course !!&依赖 +design&Hadoop&AGGREGATION +design&various goal&依赖 +handling&large dataset&AGGREGATION +we&blog&依赖 +we&Hadoop Architecture&依赖 +we&detail&依赖 +we&Hadoop Architecture Diagram&依赖 +’s&Hadoop Architecture&依赖 +master-slave topology&topology&GENERALIZATION +Hadoop&master-slave topology&依赖 +we&one master node&依赖 +we&topology&依赖 +’s function&task&依赖 +’s function&various slave node&依赖 +node&function& +slave node&actual computing&依赖 +Slave node&real datum&依赖 +we&master&依赖 +metadata&what&依赖 +Hadoop Architecture&three major layer&依赖 +hdf ( hadoop&file system ) yarn mapreduce 1&依赖 +hdf ( hadoop&file system ) yarn mapreduce 1&依赖 +HDFS hdf&Hadoop Distributed File System&依赖 +data storage&Hadoop&AGGREGATION +hdf&data unit&依赖 +hdf&smaller unit&依赖 +It&two daemons run&依赖 +namenode and datanode hdfs&Master-slave architecture&依赖 +daemon&master server&依赖 +daemon&master server&依赖 +It&Namespace management&依赖 +DataNode daemon&slave node&依赖 +DataNode daemon&daemon&GENERALIZATION +file&data block&依赖 +file&number&依赖 +number&data block&AGGREGATION +group&slave machine&AGGREGATION +Namenode&system namespace&依赖 +Namenode&modification&依赖 +opening&files or directory&依赖 +NameNode&track&依赖 +NameNode&DataNodes&依赖 +mapping&block&AGGREGATION +NameNode&mapping&依赖 +track&mapping&AGGREGATION +DataNodes&read/write request&依赖 +DataNodes&file system ’s client&依赖 +DataNode&NameNode&依赖 +DataNode&delete&依赖 +DataNode&demand&依赖 +native language&hdf&AGGREGATION +Java&hdf&依赖 +one&machine&依赖 +one&DataNode and NameNode&依赖 +one&having&依赖 +one dedicated machine&typical deployment&依赖 +one dedicated machine&typical deployment&依赖 +other node&cluster run datanode&依赖 +other node&cluster run datanode&依赖 +NameNode&metada&依赖 +location&block&AGGREGATION +NameNode&metada&依赖 +NameNode&block&依赖 +NameNode&DataNodes&依赖 +You&hadoop high availability concept&依赖 +You&hadoop high availability concept&依赖 +smallest unit&storage&AGGREGATION +default block size&block size&GENERALIZATION +block size&size&GENERALIZATION +we&128MB&依赖 +we&default block size&依赖 +we&default block size&依赖 +we&128MB&依赖 +default block size&128MB&AGGREGATION +One&block size&依赖 +us&example&依赖 +us&file&依赖 +example&file&AGGREGATION +128mb then hdf&6 block&依赖 +our&size& +128mb then hdf&file&依赖 +128MB and one block&60MB&AGGREGATION +Five block&128MB and one block&AGGREGATION +we&size&依赖 +we&size&依赖 +we&file&依赖 +we&file&依赖 +file&size&AGGREGATION +we&file&依赖 +we&file&依赖 +we&size&依赖 +we&size&依赖 +we&numerous block&依赖 +4kb&block size&AGGREGATION +huge metada&NameNode&依赖 +Replication Management&replication technique&依赖 +copy&block and store&AGGREGATION +it©&依赖 +it&block and store&依赖 +it&block and store&依赖 +it©&依赖 +it&different datanode&依赖 +it&different datanode&依赖 +how many copy&block&AGGREGATION +we&value&依赖 +It&default&依赖 +file&1GB&AGGREGATION +we&file&依赖 +we&1GB&依赖 +replication factor&3&AGGREGATION +it&3gb&依赖 +3gb&total storage&AGGREGATION +it&total storage&依赖 +NameNode&block report&依赖 +NameNode&DataNode&依赖 +NameNode&replica&依赖 +rack&many DataNode machine&依赖 +hdf&block&依赖 +replica&block&AGGREGATION +hdf&replica&依赖 +hdf&rack awareness algorithm&依赖 +hdf&distributed fashion&依赖 +rack awareness algorithm&local rack&依赖 +rack awareness algorithm&first block&依赖 +It&more than two block&依赖 +It&same rack&依赖 +It&possible&依赖 +MapReduce MapReduce&Hadoop&依赖 +MapReduce MapReduce&MapReduce&GENERALIZATION +data processing layer&Hadoop&AGGREGATION +large amount&datum&AGGREGATION +MapReduce&cluster&依赖 +cluster&low-end machine&AGGREGATION +MapReduce&low-end machine&依赖 +MapReduce&application&依赖 +MapReduce&application&依赖 +It&reliable and fault-tolerant manner&依赖 +number&map task&AGGREGATION +MapReduce job&map task&依赖 +MapReduce job&number&依赖 +task&part&依赖 +part&datum&AGGREGATION +task&datum&依赖 +function&transform and filter datum&依赖 +function&Map task&AGGREGATION +sub-set&output&AGGREGATION +Reduce task&intermediate datum&依赖 +Reduce task&aggregation&依赖 +Reduce task&map task&依赖 +input file&hdf&依赖 +input file&file&GENERALIZATION +MapReduce job&job&GENERALIZATION +input file&hdf&依赖 +inputformat&input file&依赖 +byte-oriented view&chunk&AGGREGATION +chunk&input file&AGGREGATION +input split&map task&依赖 +map task&task&GENERALIZATION +map task&node&依赖 +RecordReader The recordreader&record&依赖 +RecordReader The recordreader&input split&依赖 +It&datum&依赖 +It&record&依赖 +mapper function&function&GENERALIZATION +datum&record&依赖 +mapper&phase&依赖 +mapper&key-value pair&依赖 +mapper&recordreader&依赖 +It&zero or multiple intermediate key-value pair&依赖 +decision&mapper function&依赖 +decision&mapper function&依赖 +reducer function&datum&依赖 +reducer function&operation&依赖 +reducer function&function&GENERALIZATION +Combiner&intermediate datum&依赖 +Combiner&mapper&依赖 +It&one mapper&依赖 +small scope&one mapper&AGGREGATION +It&small scope&依赖 +amount&datum&AGGREGATION +1 ) three time&more network bandwidth&依赖 +1 ) three time&example&依赖 +Partitioner Partitioner&intermediate key-value pair&依赖 +Partitioner Partitioner&mapper&依赖 +It&one shard&依赖 +It&them&依赖 +It&reducer&依赖 +It&them&依赖 +partitioner&hashcode&依赖 +hashcode&key&AGGREGATION +partitioner&key&依赖 +partitioner&hashcode&依赖 +partitioner&key&依赖 +partitioner&modulus operation&依赖 +partitioner&reducer )&依赖 +number&reducer&AGGREGATION +key.hashcode ( ) % ( number&reducer )&AGGREGATION +partitioner&modulus operation&依赖 +partitioner&key.hashcode ( ) % ( number&依赖 +partitioned datum&local file system&依赖 +partitioned datum&map task&依赖 +reducer&it&依赖 +reducer&shuffle and sort step&依赖 +this step download&written&依赖 +this step download&datum&依赖 +this step sort&individual data piece&依赖 +this step sort&individual data piece&依赖 +this step sort&large data list&依赖 +this step sort&large data list&依赖 +purpose&sort&AGGREGATION +purpose&equivalent key&依赖 +we&it&依赖 +framework&everything&依赖 +key&comparator object&依赖 +developer&control&依赖 +reducer&function&依赖 +reducer&key grouping&依赖 +framework&function key&依赖 +function key&key&GENERALIZATION +number&different way&AGGREGATION +We&reducer&依赖 +it&zero or more key-value pair&依赖 +it&solution&依赖 +core logic&solution&AGGREGATION +It&key-value pair&依赖 +It&reducer&依赖 +it&key and value&依赖 +it&tab&依赖 +it&tab&依赖 +it&key and value&依赖 +We&it&依赖 +YARN YARN&Hadoop&依赖 +YARN YARN&YARN&GENERALIZATION +resource management layer&Hadoop&AGGREGATION +basic principle&resource management and job scheduling/monitoring function&依赖 +basic principle&resource management and job scheduling/monitoring function&依赖 +one global ResourceManager and per-application ApplicationMaster&YARN&依赖 +Application&job&依赖 +single job&job&AGGREGATION +we&YARN framework&依赖 +YARN framework&framework&GENERALIZATION +we&two daemon resourcemanager and nodemanager&依赖 +ResourceManager&system&依赖 +ResourceManager&application&依赖 +ResourceManager&resource&依赖 +job&container&依赖 +job&resource usage&依赖 +job&NodeManger&AGGREGATION +ApplcationMaster&ResourceManager&依赖 +ApplcationMaster&resource&依赖 +ResourceManger&Scheduler&依赖 +ResourceManger&two important component&依赖 +it&tracking&依赖 +tracking&status&AGGREGATION +it&application&依赖 +it&tracking&依赖 +it&application&依赖 +It&task&依赖 +scheduler&resource&依赖 +requirement&application&AGGREGATION +function&ApplicationManager&AGGREGATION +Application Manager follow&ApplicationManager&依赖 +container&CPU , memory , disk , and network&依赖 +container&element&依赖 +function&ApplicationMaster&AGGREGATION +monitor progress&application&AGGREGATION +We&YARN&依赖 +We&YARN Federation feature&依赖 +We&few thousand node&依赖 +feature&multiple YARN cluster&依赖 +feature&us&依赖 +feature&Yarn YARN&AGGREGATION +feature&features :&依赖 +YARN&access engine&依赖 +variety&access engine&AGGREGATION +YARN&open-source or propriety )&依赖 +YARN&variety&依赖 +YARN&resource&依赖 +YARN&cluster&依赖 +YARN&dynamic allocation&依赖 +YARN&good use&依赖 +dynamic allocation&resource&AGGREGATION +good use&cluster&AGGREGATION +previous version&Hadoop&AGGREGATION +lesser utilization&cluster&AGGREGATION +YARN ’s ResourceManager&ever-expanding cluster&依赖 +petabyte&datum&AGGREGATION +YARN ’s ResourceManager&scheduling and cope&依赖 +YARN ’s ResourceManager&petabyte&依赖 +YARN ’s ResourceManager&datum&依赖 +MapReduce program&YARN&依赖 +MapReduce program&YARN&依赖 +people&idea&依赖 +people&Hadoop&依赖 +Hadoop&cheap storage and deep datum analysis&依赖 +this use jbod&Disk&依赖 +this use jbod&a bunch&依赖 +their&complexity& +Start Small and Keep Focus Many project&complexity and expense&依赖 +small cluster&node&AGGREGATION +infrastructure and development guy&internal working&依赖 +infrastructure and development guy&Hadoop&依赖 +internal working&Hadoop&AGGREGATION +Data Integration One&feature&AGGREGATION +feature&Hadoop&AGGREGATION +we&data structure&依赖 +We&flume and sqoop&依赖 +We&tool&依赖 +We&datum&依赖 +it&data integration process&依赖 +proper documentation&data source&AGGREGATION +they&cluster&依赖 +Use Compression Technique Enterprise&compression&依赖 +Use Compression Technique Enterprise&love-hate relationship&依赖 +it&performance&依赖 +compression&storage&依赖 +Hadoop&compression&依赖 +It&storage usage&依赖 +It&80 %&依赖 +different project&different requirement&依赖 +Apache Hadoop&Hadoop&GENERALIZATION +Apache Hadoop&wide ecosystem&依赖 +different project&different requirement&依赖 +it&itself&依赖 +design&Hadoop Architecture&AGGREGATION +Its&structure& +We&linearly&依赖 +MapReduce part&principle&依赖 +MapReduce part&principle&依赖 +principle&data locality&AGGREGATION +MapReduce part&design&AGGREGATION +MapReduce part&part&GENERALIZATION +MapReduce part&data locality&依赖 +MapReduce part&data locality&依赖 +Map-Reduce framework&datum&依赖 +Map-Reduce framework&computation close&依赖 +network traffic&major bandwidth&依赖 +overall architecture&Hadoop&AGGREGATION +your&Interview& +Hadoop Architecture&Hadoop Interview&依赖 +We&you&依赖 +You&Hadoop Architecture&依赖 +You&many question&依赖 diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt" new file mode 100644 index 0000000..280390e --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt" @@ -0,0 +1,161 @@ +Hadoop Architecture in Detail – HDFS, Yarn & MapReduce +Boost your career with Big Data Get Exclusive Offers on Big Data Course!! +Hadoop now has become a popular solution for today’s world needs. The design of Hadoop keeps various goals in mind. These are fault tolerance, handling of large datasets, data locality, portability across heterogeneous hardware and software platforms etc. In this blog, we will explore the Hadoop Architecture in detail. Also, we will see Hadoop Architecture Diagram that helps you to understand it better. + +So, let’s explore Hadoop Architecture. + +Hadoop Architecture in Detail - HDFS, Yarn & MapReduce + +What is Hadoop Architecture? +Hadoop has a master-slave topology. In this topology, we have one master node and multiple slave nodes. Master node’s function is to assign a task to various slave nodes and manage resources. The slave nodes do the actual computing. Slave nodes store the real data whereas on master we have metadata. This means it stores data about data. What does metadata comprise that we will see in a moment? + +Hadoop Application Architecture in Detail + +Hadoop Architecture comprises three major layers. They are:- + +HDFS (Hadoop Distributed File System) +Yarn +MapReduce +1. HDFS +HDFS stands for Hadoop Distributed File System. It provides for data storage of Hadoop. HDFS splits the data unit into smaller units called blocks and stores them in a distributed manner. It has got two daemons running. One for master node – NameNode and other for slave nodes – DataNode. + +a. NameNode and DataNode +HDFS has a Master-slave architecture. The daemon called NameNode runs on the master server. It is responsible for Namespace management and regulates file access by the client. DataNode daemon runs on slave nodes. It is responsible for storing actual business data. Internally, a file gets split into a number of data blocks and stored on a group of slave machines. Namenode manages modifications to file system namespace. These are actions like the opening, closing and renaming files or directories. NameNode also keeps track of mapping of blocks to DataNodes. This DataNodes serves read/write request from the file system’s client. DataNode also creates, deletes and replicates blocks on demand from NameNode. + + + +Hadoop Architecture Diagram + +Java is the native language of HDFS. Hence one can deploy DataNode and NameNode on machines having Java installed. In a typical deployment, there is one dedicated machine running NameNode. And all the other nodes in the cluster run DataNode. The NameNode contains metadata like the location of blocks on the DataNodes. And arbitrates resources among various competing DataNodes. + +You must read about Hadoop High Availability Concept + +b. Block in HDFS +Block is nothing but the smallest unit of storage on a computer system. It is the smallest contiguous storage allocated to a file. In Hadoop, we have a default block size of 128MB or 256 MB. + +Hadoop Architecture Diagram + +One should select the block size very carefully. To explain why so let us take an example of a file which is 700MB in size. If our block size is 128MB then HDFS divides the file into 6 blocks. Five blocks of 128MB and one block of 60MB. What will happen if the block is of size 4KB? But in HDFS we would be having files of size in the order terabytes to petabytes. With 4KB of the block size, we would be having numerous blocks. This, in turn, will create huge metadata which will overload the NameNode. Hence we have to choose our HDFS block size judiciously. + +c. Replication Management +To provide fault tolerance HDFS uses a replication technique. In that, it makes copies of the blocks and stores in on different DataNodes. Replication factor decides how many copies of the blocks get stored. It is 3 by default but we can configure to any value. + +Hadoop Replication Factor + +The above figure shows how the replication technique works. Suppose we have a file of 1GB then with a replication factor of 3 it will require 3GBs of total storage. + +To maintain the replication factor NameNode collects block report from every DataNode. Whenever a block is under-replicated or over-replicated the NameNode adds or deletes the replicas accordingly. + +d. What is Rack Awareness? +Hadoop Architecture + +A rack contains many DataNode machines and there are several such racks in the production. HDFS follows a rack awareness algorithm to place the replicas of the blocks in a distributed fashion. This rack awareness algorithm provides for low latency and fault tolerance. Suppose the replication factor configured is 3. Now rack awareness algorithm will place the first block on a local rack. It will keep the other two blocks on a different rack. It does not store more than two blocks in the same rack if possible. + +2. MapReduce +MapReduce is the data processing layer of Hadoop. It is a software framework that allows you to write applications for processing a large amount of data. MapReduce runs these applications in parallel on a cluster of low-end machines. It does so in a reliable and fault-tolerant manner. + +MapReduce job comprises a number of map tasks and reduces tasks. Each task works on a part of data. This distributes the load across the cluster. The function of Map tasks is to load, parse, transform and filter data. Each reduce task works on the sub-set of output from the map tasks. Reduce task applies grouping and aggregation to this intermediate data from the map tasks. + +The input file for the MapReduce job exists on HDFS. The inputformat decides how to split the input file into input splits. Input split is nothing but a byte-oriented view of the chunk of the input file. This input split gets loaded by the map task. The map task runs on the node where the relevant data is present. The data need not move over the network and get processed locally. + +Hadoop Architecture - MapReduce + +i. Map Task +The Map task run in the following phases:- + +a. RecordReader +The recordreader transforms the input split into records. It parses the data into records but does not parse records itself. It provides the data to the mapper function in key-value pairs. Usually, the key is the positional information and value is the data that comprises the record. + +b. Map +In this phase, the mapper which is the user-defined function processes the key-value pair from the recordreader. It produces zero or multiple intermediate key-value pairs. + +The decision of what will be the key-value pair lies on the mapper function. The key is usually the data on which the reducer function does the grouping operation. And value is the data which gets aggregated to get the final result in the reducer function. + +c. Combiner +The combiner is actually a localized reducer which groups the data in the map phase. It is optional. Combiner takes the intermediate data from the mapper and aggregates them. It does so within the small scope of one mapper. In many situations, this decreases the amount of data needed to move over the network. For example, moving (Hello World, 1) three times consumes more network bandwidth than moving (Hello World, 3). Combiner provides extreme performance gain with no drawbacks. The combiner is not guaranteed to execute. Hence it is not of overall algorithm. + +d. Partitioner +Partitioner pulls the intermediate key-value pairs from the mapper. It splits them into shards, one shard per reducer. By default, partitioner fetches the hashcode of the key. The partitioner performs modulus operation by a number of reducers: key.hashcode()%(number of reducers). This distributes the keyspace evenly over the reducers. It also ensures that key with the same value but from different mappers end up into the same reducer. The partitioned data gets written on the local file system from each map task. It waits there so that reducer can pull it. + +b. Reduce Task +The various phases in reduce task are as follows: + +i. Shuffle and Sort +The reducer starts with shuffle and sort step. This step downloads the data written by partitioner to the machine where reducer is running. This step sorts the individual data pieces into a large data list. The purpose of this sort is to collect the equivalent keys together. The framework does this so that we could iterate over it easily in the reduce task. This phase is not customizable. The framework handles everything automatically. However, the developer has control over how the keys get sorted and grouped through a comparator object. + +ii. Reduce +The reducer performs the reduce function once per key grouping. The framework passes the function key and an iterator object containing all the values pertaining to the key. + +We can write reducer to filter, aggregate and combine data in a number of different ways. Once the reduce function gets finished it gives zero or more key-value pairs to the outputformat. Like map function, reduce function changes from job to job. As it is the core logic of the solution. + +iii. OutputFormat +This is the final step. It takes the key-value pair from the reducer and writes it to the file by recordwriter. By default, it separates the key and value by a tab and each record by a newline character. We can customize it to provide richer output format. But none the less final data gets written to HDFS. + +Hadoop MapReduce Architecture Diagram + +3. YARN +YARN or Yet Another Resource Negotiator is the resource management layer of Hadoop. The basic principle behind YARN is to separate resource management and job scheduling/monitoring function into separate daemons. In YARN there is one global ResourceManager and per-application ApplicationMaster. An Application can be a single job or a DAG of jobs. + +Inside the YARN framework, we have two daemons ResourceManager and NodeManager. The ResourceManager arbitrates resources among all the competing applications in the system. The job of NodeManger is to monitor the resource usage by the container and report the same to ResourceManger. The resources are like CPU, memory, disk, network and so on. + +The ApplcationMaster negotiates resources with ResourceManager and works with NodeManger to execute and monitor the job. + +Hadoop Architecture + +The ResourceManger has two important components – Scheduler and ApplicationManager + +i. Scheduler +Scheduler is responsible for allocating resources to various applications. This is a pure scheduler as it does not perform tracking of status for the application. It also does not reschedule the tasks which fail due to software or hardware errors. The scheduler allocates the resources based on the requirements of the applications. + +ii. Application Manager +Following are the functions of ApplicationManager + +Accepts job submission. +Negotiates the first container for executing ApplicationMaster. A container incorporates elements such as CPU, memory, disk, and network. +Restarts the ApplicationMaster container on failure. +Functions of ApplicationMaster:- + +Negotiates resource container from Scheduler. +Tracks the resource container status. +Monitors progress of the application. +We can scale the YARN beyond a few thousand nodes through YARN Federation feature. This feature enables us to tie multiple YARN clusters into a single massive cluster. This allows for using independent clusters, clubbed together for a very large job. + +iii. Features of Yarn +YARN has the following features:- + +a. Multi-tenancy + +YARN allows a variety of access engines (open-source or propriety) on the same Hadoop data set. These access engines can be of batch processing, real-time processing, iterative processing and so on. + +b. Cluster Utilization + +With the dynamic allocation of resources, YARN allows for good use of the cluster. As compared to static map-reduce rules in previous versions of Hadoop which provides lesser utilization of the cluster. + +c. Scalability + +Any data center processing power keeps on expanding. YARN’s ResourceManager focuses on scheduling and copes with the ever-expanding cluster, processing petabytes of data. + +d. Compatibility + +MapReduce program developed for Hadoop 1.x can still on this YARN. And this is without any disruption to processes that already work. + +Best Practices For Hadoop Architecture Design +i. Embrace Redundancy Use Commodity Hardware +Many companies venture into Hadoop by business users or analytics group. The infrastructure folks peach in later. These people often have no idea about Hadoop. The result is the over-sized cluster which increases the budget many folds. Hadoop was mainly created for availing cheap storage and deep data analysis. To achieve this use JBOD i.e. Just a Bunch Of Disk. Also, use a single power supply. + +ii. Start Small and Keep Focus +Many projects fail because of their complexity and expense. To avoid this start with a small cluster of nodes and add nodes as you go along. Start with a small project so that infrastructure and development guys can understand the internal working of Hadoop. + +iii. Create Procedure For Data Integration +One of the features of Hadoop is that it allows dumping the data first. And we can define the data structure later. We can get data easily with tools such as Flume and Sqoop. But it is essential to create a data integration process. This includes various layers such as staging, naming standards, location etc. Make proper documentation of data sources and where they live in the cluster. + +iv. Use Compression Technique +Enterprise has a love-hate relationship with compression. There is a trade-off between performance and storage. Although compression decreases the storage used it decreases the performance too. But Hadoop thrives on compression. It can increase storage usage by 80%. + +v. Create Multiple Environments +It is a best practice to build multiple environments for development, testing, and production. As Apache Hadoop has a wide ecosystem, different projects in it have different requirements. Hence there is a need for a non-production environment for testing upgrades and new functionalities. + +Summary +Hence, in this Hadoop Application Architecture, we saw the design of Hadoop Architecture is such that it recovers itself whenever needed. Its redundant storage structure makes it fault-tolerant and robust. We are able to scale the system linearly. The MapReduce part of the design works on the principle of data locality. The Map-Reduce framework moves the computation close to the data. Therefore decreasing network traffic which would otherwise have consumed major bandwidth for moving large datasets. Thus overall architecture of Hadoop makes it economical, scalable and efficient big data technology. + +Hadoop Architecture is a very important topic for your Hadoop Interview. We recommend you to once check most asked Hadoop Interview questions. You will get many questions from Hadoop Architecture. \ No newline at end of file diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt.xml.xls" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop Architecture in Detail \342\200\223 HDFS, Yarn & MapReduce.txt.xml.xls" new file mode 100644 index 0000000000000000000000000000000000000000..7c6456bafba575d9246b014e810f8c2d5bd50418 GIT binary patch literal 46592 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 H&p-bISReJ+ literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data-relation.txt new file mode 100644 index 0000000..323f777 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data-relation.txt @@ -0,0 +1,16 @@ +highest unit&work&AGGREGATION +MapReduce programming paradigm&Map Stage&依赖 +MapReduce programming paradigm&two-step data analysis process&依赖 +map stage&set&依赖 +set&datum&AGGREGATION +map stage&datum&依赖 +output&map function&AGGREGATION +Reduce job&output&依赖 +Reduce job&map function&依赖 +smaller set&tuple&AGGREGATION +reduce job&sequence&依赖 +sequence&name MapReduce&AGGREGATION +job&several mappers and reducer&依赖 +portion&task&依赖 +portion&job&AGGREGATION +slice&datum&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt new file mode 100644 index 0000000..de93cfe --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt @@ -0,0 +1,21 @@ +MapReduce +Hadoop MapReduce- Java-based Processing Framework for Big Data +MapReduce rules the roost for massive scale big data processing on Hadoop. The highest unit of work in Hadoop MapReduce is a Job. MapReduce programming paradigm uses a two-step data analysis process- Map Stage and Reduce Stage (reduce phase is optional). The map stage takes a set of data and converts it into another set where data elements are broken down into key-value pairs or tuples. Reduce job takes the output of the map function and combines them into smaller set of tuples or key-value pairs. The reduce job is always performed when the map job is completed - hence the sequence of the name MapReduce. + +MapReduce Overview +MapReduce Terminologies +MapReduce Life Cycle +MapReduce Advantages +MapReduce Blogs +MapReduce Tutorials +MapReduce Interview Questions +MapReduce Slides +MapReduce Videos +MapReduce Questions & Answers +MapReduce Assignments + +MapReduce Terminologies +Job - It is the complete process to execute including the mappers, the input, the reducers and the output across a particular dataset. +Task - Every job is divided into several mappers and reducers. A portion of the job executed on a slice of data can be referred to as a task. +JobTracker - It is the master node for managing all the jobs and resources in a hadoop cluster. +TaskTracker - These are the agents deployed to each machine in the hadoop cluster to run Map and Reduce tasks and then report the status to the JobTracker after execution. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce- Java-based Processing Framework for Big Data.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..cfdb78508ac5c294f33e735f8cb2a6f3616d7424 GIT binary patch literal 6144 zcmeHKO>9(E6uxgd(`lvcn*su&z+=i!TUso?3KiS(BeDRr#b_dCcywON(D~!NHxO1< z)SV_86XU`SOE>;(H2y^C&IO4?7bLDgce*msL=#~AzH{fjH#3FCg)srSlk@JJbI<+G zx#ynycjde8YZpIRd0jP?Vb!8;Rohi-o!qGVuTo0Iz*BasTCK8)|MB;Jxr-t&u1fg% z%2EeZ5w)w%b1MIFS*8+3Fx-axxDCRk-M?&q`^r_L1#P3IR(KxPT{WXliXSt#>9w$E zv5JNE>Bqv_QR}jr{Ydiv{KvI>6T~`>5F|ic^GQ$}s2%hGi0${wy%zzlS?=RplMBuN zBD8maIze3^E*~5LsvEQzv;?#i^dM*%XgO#F=poQb(8HidK&wEjL2E!3Xe}rW>H)0- ztp{xYZ3Oj#`au1lO`rkLAZRn_QP2=*3ur578)!Rd2WThgG0@|nU7+2dVbBwx`+3}$ z!|iRD#ny!SA$2)9hWK#pUq?oK9G{cC_zC=RRYraoPrv)Qv*xImJ#GC5Wv}>P8_dl; z@_iqYF60v>*!A&UBHxds^((E3mQzNTaeVjJJ)C{sNnVJJir$;@P0P0nUqgK+eSQ?l z7G&td6e)Dpp8(UAkwWr)MbBH{2Wi?^_*TgXm+e1QN8q zIPPR$s#meFF=HtODw~HIFu($4JvMHuS*H<6EAGI`!WzoZK))4uRAYOE?;EbM>A^Jo z$@Gq9U||5u5(_lbTi>hSin{b$4f=bqbTJ+EhP3Amw&+xyxsj2`;C8HktoYDi&^xeM z>ndiWe%EA2QtFQ?!V#8B7Ui5|k^devEG%cf-A?~ba-!Z&|6Z0GOuMiI@!X{2@Mq8v z$ouXfAGm|O{|@r@dGdE+ag~~Fsj}{#ZIycQY+ULkvq`Ddtde@^Y@&KX_JP;2yZp>+ z4_4vCDaY}L-oS}y;P;^+b$mG%R&8@oH&h|^EOdDmVb2_Q&SVbl$H6#Js<@L*W?!i| z>6Cp4j@jy>FG=`gp=lHmH`u2?Dp$2@VfPo2bq0K5yvDXg7 zxm5AX6(5c4K2<4BGK{#N)&_REbP^X6-BGKeFGk}P?0nvF2}VPea$dr>6FprW67NQI0kAo;d816N#U3J%*0h?mbzI#pbA+SGoq z7`^%e^##;Dh{><0-$Q)@x%n6BIn-wWxeGq=>aLIYl=`ysa&itlRMesvFKfE+3diyd z2GuDCV+X!jT=95FcFXaYg6$h0{Pz9flh2G~MBXp*P4c}Ul3C~kWj&T24pa3CTIS-x z#qd?peoej?RT}775PvZ>U<}mO*0m9ha&5#=&!GjVF}Q}JJ*Abl7%!iEqSRh|hAA>a zB${Lh!#o+{K2JuEoBJZn^JI))vmW=2W*Pl#mhm~&EaMzC%aA4WWSsYAJzmF~WsFs` zjMw#M86#LPyD8bCul7o5&OjD0rkaaMP6S*FIL1-8#lbOxnoEFV>@?R3j#1NG5**`2 zj@X#FkfS}uNVm}*qhrKcp-FpMPFsu+InJ&rYeI8GU{o|m1ja*iMBu13M-;||9LEu% z;Ia!YKxu&uQ*uvh5`|A5&DEoD{H8pG*v3P{lq-nlh{ETQ=7_?FlIH4B7`F%|At*t= zg!sb86=RYJW0HWiC?3R9lfMClTg{+cGA zN2WZvbsJFz!nS%8=1PRZy~32|I{WebFy%4N(QvQOQRO}nMV0F@LP!b1V9i!a5Q1z^ zg$St-;VSUkknW>KS?yI%$&a=EU;ppP*kbi57ls<;r&d;pU&3%JVqu~*zL6K=q|06W F`5WYyH8}tP literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1-relation.txt new file mode 100644 index 0000000..57cac49 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1-relation.txt @@ -0,0 +1,107 @@ +Introduction&large set&依赖 +Introduction&datum&依赖 +large set&datum&AGGREGATION +Google&that&依赖 +MapReduce&picture&依赖 +huge chunk&datum&AGGREGATION +huge amount&datum&AGGREGATION +parallel processing&huge amount&AGGREGATION +Map Reduce program&programmer&依赖 +they&MapReduce&依赖 +development&applications and deployment&AGGREGATION +development&programmer&依赖 +flow pattern&MapReduce&AGGREGATION +they&flow pattern&依赖 +Explanation&Python and C++&依赖 +Explanation&MapReduce Architecture Hadoop&AGGREGATION +Explanation&programming language&依赖 +application&software processing huge amount&AGGREGATION +software processing huge amount&datum&AGGREGATION +framework&task&依赖 +chunk&datum&AGGREGATION +framework&chunk&依赖 +a file-system store&work and input&依赖 +work and input&job&AGGREGATION +a file-system store&job&依赖 +Re-execution&framework&依赖 +Re-execution&framework&依赖 +task&framework&AGGREGATION +Re-execution&failed task&AGGREGATION +architecture&two main processing stage&依赖 +architecture&MapReduce&AGGREGATION +MapReduce&Job tracker&依赖 +Intermediate process&place&依赖 +local file system store&intermediate datum&依赖 +take&other datum&依赖 +certain number&output&AGGREGATION +take&it&依赖 +take&set&依赖 +breakdown&individual element&AGGREGATION +take&it&依赖 +take&set&依赖 +take&other datum&依赖 +set&other datum&AGGREGATION +Mappers output&reduction&依赖 +single mapper&reduced function&依赖 +new output value&hdf&依赖 +MapReduce architecture&architecture&GENERALIZATION +MapReduce Architecture Components Below&component&依赖 +component&MapReduce architecture&AGGREGATION +MapReduce Architecture Components Below&MapReduce architecture&依赖 +explanation&component&AGGREGATION +Map Phase Map phase&two part&依赖 +Map Phase Map phase&input datum&依赖 +Value&processing stage&依赖 +Let ’s&input datum&依赖 +Key-value pair conversion&record reader&依赖 +Key-value pair conversion&input datum&依赖 +piece&data format and code&AGGREGATION +reducer code place input&reducer code place input&依赖 +reducer code place input&combiner&依赖 +reducer code place input&reducer code place input&依赖 +reducer code place input&combiner&依赖 +partition module&key role&依赖 +partition module&Hadoop&依赖 +map input&sort and shuffle phase&依赖 +intermediate datum&local file system&依赖 +Hadoop node&replication&依赖 +Reducer Phase&data input&依赖 +Reducer Phase&data input&依赖 +reducer&searching&依赖 +number&reducer&AGGREGATION +speculative execution&job processing&依赖 +speculative execution&prominent role&依赖 +task&run&依赖 +more than one mapper&similar datum&依赖 +task&next mapper&依赖 +task&fast program&依赖 +| Verifiable Certificate&Access&AGGREGATION +job&two component&依赖 +job&split&依赖 +job&Map task&依赖 +complete execution&given job&AGGREGATION +Conclusion&document&依赖 +lot&document&AGGREGATION +Conclusion&lot&依赖 +you&number&依赖 +number&word&AGGREGATION +occurrence&word&AGGREGATION +number&occurrence&AGGREGATION +you&word&依赖 +you&lot&依赖 +lot&web page&AGGREGATION +you&web page&依赖 +them&search query&依赖 +I&arbitrary task&依赖 +reducer&datum&依赖 +reducer&aggregation&依赖 +it&key&依赖 +aggregation&datum&AGGREGATION +Recommended Articles This&MapReduce Architecture&依赖 +component&architecture&AGGREGATION +we&explanation&依赖 +we&MapReduce Architecture&依赖 +we&component&依赖 +we&introduction&依赖 +You&more –&依赖 +our&articles& diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt new file mode 100644 index 0000000..c08e74f --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt @@ -0,0 +1,48 @@ +Introduction to MapReduce Architecture +Hadoop cluster stores a large set of data which is parallelly processed mainly by MapReduce. Firstly, it was just a thesis that Google designed. That provides parallelism, fault-tolerance, and data distribution. For processing huge chunks of data, MapReduce comes into the picture. Map Reduce provides API with features such as parallel processing of huge amounts of data, batch processing, and high availability. Map Reduce programs are written by programmers when there is a need for an application for business scenarios. The development of applications and deployment across Hadoop clusters is done by the programmers when they understand the flow pattern of MapReduce. + +Explanation of MapReduce Architecture +Hadoop can be developed in programming languages like Python and C++. MapReduce Hadoop is a software framework for ease in writing applications of software processing huge amounts of data. MapReduce is a framework which splits the chunk of data, sorts the map outputs and input to reduce tasks. A File-system stores the work and input of jobs. Re-execution of failed tasks, scheduling them, and monitoring them is the task of the framework. + +The architecture of MapReduce basically has two main processing stages, and those are Map and Reduce. The MapReduce happens in Job tracker. Intermediate processes will take place in between the Map and Reduce phases. Sort and shuffle are the tasks taken up by Map and Reduce, which are done intermediate. The local file system stores the intermediate data. + +Map() Function: Create and process the import data. Takes in data, converts it into a set of other data where the breakdown of individual elements into tuples is done—no API contract requiring a certain number of outputs. +Reduce() Function: Mappers output is passed into the reduction. Processes the data into something usable. Every single mapper is passed into the reduced function. The new output values are saved into HDFS. +MapReduce Architecture Components +Below is the explanation of components of MapReduce architecture: + +MapReduce1 +1. Map Phase +Map phase splits the input data into two parts. They are Keys and Values. Writable and comparable is the key in the processing stage where only in the processing stage, Value is writable. Let’s say a client gives input data to a Hadoop system; task tracker is assigned tasks by job tracker. Splitting of input is done into several inputs. Key-value pair conversion is done with the input data by the record reader. This is the actual data input for Map as in mapped information for further processing. The format type varies, so the coder has to look into each piece of data format and code accordingly. + +Mini reducer which is commonly called a combiner, the reducer code places input as the combiner. Network bandwidth is high when a huge amount of data is required. Hash is the default partition used. The partition module plays a key role in Hadoop. More performance is given by reducing the pressure by petitioner on the reducer. + +2. Processing in Intermediate +In the intermediate phase, the map input gets into the sort and shuffle phase. Hadoop nodes do not have replications where all the intermediate data is stored in a local file system. Round – robin data is used by Hadoop to write to local disk, the intermediate data. There are other shuffles and sort factors to be considered to reach the condition of writing the data to local disks. + +3. Reducer Phase +The reducer takes in the data input that is sorted and shuffled. All the input data will be combined, and similar key-value pairs are to be written to the hdfs system. For searching and mapping purposes, a reducer is not always necessary. Setting some properties for enabling to develop of the number of reducers for each task. During job processing, speculative execution plays a prominent role. The performance is FIFO that is first in first out, and if more than one mapper is working on similar data, and if one is running slow, then the tasks are assigned to the next mapper for a fast program run by the job tracker. + + Popular Course in this category +MapReduce Training (2 Courses, 4+ Projects) +2 Online Courses | 4 Hands-on Projects | 19+ Hours | Verifiable Certificate of Completion | Lifetime Access +4.5 (6,176 ratings)Course Price +$79 $399 +View Course +Related Courses +Data Scientist Training (76 Courses, 60+ Projects)Machine Learning Training (17 Courses, 27+ Projects)Hadoop Training Program (20 Courses, 14+ Projects, 4 Quizzes) +MapReduce2 +This is how MapReduce organizers work. + +The job is divided into two components: Map tasks (Splits and mapping) and Reduce tasks (Reducing and shuffling). +The above picture says that Job tracker is associated with complete execution of a given job, by behaving like a master. Whereas, the Multiple task trackers act like slaves by performing the job each. +Conclusion +Imagine you have lots of documents, which is huge data. And you need to count the number of occurrences of each word throughout the documents. I might seem like an arbitrary task, but the basic idea is that let’s say you have a lot of web pages and you want to make them available for search queries. The reducer does aggregation of data, and it consists of all the keys and combines them all for similar key-value pairs which is basically the Hadoop shuffling process. + +Recommended Articles +This is a guide to MapReduce Architecture. Here we discuss an introduction to MapReduce Architecture, explanation of components of the architecture in detail. You can also go through our other related articles to learn more – + +Mapreduce Combiner +How MapReduce Works +What is MapReduce in Hadoop? +MapReduce Algorithms diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture1.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..baa4ea40dea9c37485d5dd346501ceb9d73e882c GIT binary patch literal 16896 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 pair&依赖 +RecordReader&InputSplit&依赖 +byte-oriented view&input&AGGREGATION +RecordReader&byte-oriented view&依赖 +RecordReader&input&依赖 +record-oriented view&input datum&AGGREGATION +RecordReader&datum&依赖 +RecordReader&key-value pair&依赖 +RecordReader&InputSplit&依赖 +key-value pair&further processing&依赖 +key-value pair&mapper&依赖 +Mapper - Mapper&input record&依赖 +input record&record&GENERALIZATION +mapper output&as intermediate output&依赖 +mapper output&local disk&依赖 +mapper output&output&GENERALIZATION +it&unnecessary copy&依赖 +Mappers output&combiner&依赖 +Mappers output&further process&依赖 +Mappers output&output&GENERALIZATION +Map&set&依赖 +set&datum&AGGREGATION +Map&datum&依赖 +Mapper&datum&依赖 +form&key/value pair&AGGREGATION +Mapper&key/value pair&依赖 +Mapper&form&依赖 +Combiner&map task&依赖 +output&map task&AGGREGATION +Combiner&output&依赖 +combiner&local reducer&依赖 +Hadoop&combiner function&依赖 +Hadoop&map output&依赖 +Hadoop&one or many time&依赖 +map output&output&GENERALIZATION +how output&reducer&依赖 +how output&reducer&依赖 +Partitioner&keys partition&依赖 +Partitioner&intermediate map-output&依赖 +keys partition&intermediate map-output&AGGREGATION +key&key&AGGREGATION +number&job&依赖 +number&reduce task&依赖 +number&of&AGGREGATION +total number&partition&AGGREGATION +its&execution& +Partitioner&same machine&依赖 +mapper&execution&依赖 +partitioner form number&partitioner form number&依赖 +partitioner form number&reduce task group&依赖 +partitioner form number&reduce task group&AGGREGATION +Hadoop framework&hash base partitioner&依赖 +Hadoop framework&default&依赖 +Hadoop framework&default&依赖 +hash partitioner partition&key space&依赖 +hash partitioner partition&key space&依赖 +output&partitioner&AGGREGATION +physical movement&datum&AGGREGATION +shuffling&network&依赖 +shuffling&datum&依赖 +mapper&process&依赖 +output produce&reducer node&依赖 +their&process& +intermediate value&list&依赖 +reducer task&mapper&依赖 +reducer task&output&依赖 +reducer task&input&依赖 +smaller set&tuple&AGGREGATION +their&lists& +intermediate key&reducer&依赖 +intermediate key&sorted key order&依赖 +reducer&zero or more final key/value pair&依赖 +RecordWriter & OutputFormat&Reducer phase&依赖 +RecordWriter & OutputFormat&output file&依赖 +RecordWriter & OutputFormat&output key-value pair&依赖 +output key-value pair&key-value pair&GENERALIZATION +Reducer phase&phase&GENERALIZATION +way&OutputFormat&依赖 +final output&OutputFormat instance&依赖 +final output&hdf&依赖 +final output&reducer&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt new file mode 100644 index 0000000..c29fcc1 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt @@ -0,0 +1,72 @@ +MapReduce is a programming model and expectation is parallel processing in Hadoop. MapReduce makes easy to distribute tasks across nodes and performs Sort or Merge based on distributed computing. + +The underlying system takes care of partitioning input data, scheduling the programs execution across several machines, handling machine failures and managing inter-machine communication. + +Input will be divided into multiple chunks/blocks. Each and every chunk/block of data will be processed in different nodes. MapReduce architecture contains the below phases - + +Input Files +InputFormat +InputSplit +RecordReader +Mapper +Combiner +Partitioner +Shuffling and Sorting +Reducer +RecordWriter +OutputFormat +Input Files - +In general, the input data to process using MapReduce task is stored in input files. These input files typically reside in HDFS (Hadoop Distributed File System). The format of these files is random where other formats like binary or log files can also be used. + +InputFormat - +InputFormat describes the input-specification for a Map-Reduce job. InputFormat defines how the input files are to split and read. InputFormat selects the files or other objects used for input. + +InputFormat creates InputSplit from the selected input files. InputFormat split the input into logical InputSplits based on the total size, in bytes of the input files. + +InputSplit - +InputSplit is created by InputFormat. InputSplit logically represents the data to be processed by an individual Mapper. One map task is created to process one InputSplit. + +The number of map tasks normally equals to the number of InputSplits. The InputSplit is divided into input records and each record is processed by the specific mapper assigned to process the InputSplit. InputSplit presents a byte-oriented view on the input. + +RecordReader - +RecordReader communicates with the InputSplit in Hadoop MapReduce. RecordReader reads pairs from an InputSplit. RecordReader converts the byte-oriented view of the input from the InputSplit. + +RecordReader provides a record-oriented view of the input data for mapper and reducer tasks processing. RecordReader converts the data into key-value pairs suitable for reading by the mapper. + +RecordReader communicates with the InputSplit until the file reading is not completed. Once the file reading completed, these key-value pairs are sent to the mapper for further processing. + +Mapper - +Mapper processes each input record and generates new key-value pair. Mapper generated key-value pair is completely different from the input key-value pair. The mapper output is called as intermediate output. + +The mapper output is not written to local disk because of it creates unnecessary copies. Mappers output is passed to the combiner for further process. + +Map takes a set of data and converts it into another set of data, where individual elements are broken down into key pairs. The Mapper reads the data in the form of key/value pairs and outputs zero or more key/value pairs. + +Combiner - +Combiner acts as a mini reducer in MapReduce framework. This is an optional class provided in MapReduce driver class. Combiner process the output of map tasks and sends it to the Reducer. + +For every mapper, there will be one Combiner. Combiners are treated as local reducers. Hadoop does not provide any guarantee on combiner’s execution. + +Hadoop may not call combiner function if it is not required. Hadoop may call one or many times for a map output based on the requirement. + +Partitioner - +Partitioner allows distributing how outputs from the map stage are send to the reducers. Partitioner controls the keys partition of the intermediate map-outputs. The key or a subset of the key is used to derive the partition by a hash function. + +The total number of partitions is almost same as the number of reduce tasks for the job. Partitioner runs on the same machine where the mapper had completed its execution by consuming the mapper output. Entire mapper output sent to partitioner. + +Partitioner forms number of reduce task groups from the mapper output. By default, Hadoop framework is hash based partitioner. The Hash partitioner partitions the key space by using the hash code. + +Shuffling and Sorting - +The output of the partitioner is Shuffled to the reduce node. The shuffling is the physical movement of the data over the network. Once the mappers finished their process, the output produced are shuffled on reducer nodes. + +The mapper output is called as intermediate output and it is merged and then sorted. The sorted output is provided as a input to the reducer phase. + +Reducer - +After the map phase is over, all the intermediate values for the intermediate keys are combined into a list. Reducer task, which takes the output from a mapper as an input and combines those data tuples into a smaller set of tuples. There may be single reducer, multiple reducers. + +All the values associated with an intermediate key are guaranteed to go to the same reducer. The intermediate key and their value lists are passed to the reducer in sorted key order. The reducer outputs zero or more final key/value pairs and these are written to HDFS. + +RecordWriter & OutputFormat - +RecordWriter writes these output key-value pair from the Reducer phase to the output files. The way of writing the output key-value pairs to output files by RecordWriter is determined by the OutputFormat. + +OutputFormat instances provided by the Hadoop are used to write files in HDFS or on the local disk. The final output of reducer is written on HDFS by OutputFormat instances. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture2.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..ac66005418b2b4a5b401b9a494edc4774ff401ce GIT binary patch literal 18432 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3-relation.txt new file mode 100644 index 0000000..ec67674 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3-relation.txt @@ -0,0 +1,71 @@ +two major component&Hadoop&AGGREGATION +2020 MapReduce and HDFS&Hadoop&依赖 +library&various different-different optimization&依赖 +library&many programming language&依赖 +it&equivalent task&依赖 +purpose&MapReduce&AGGREGATION +it&it&依赖 +MapReduce task&two phase map phase&依赖 +who&Job&依赖 +Components&MapReduce Architecture&AGGREGATION +who&MapReduce&依赖 +who&processing&依赖 +multiple client&job&依赖 +multiple client&job for ###&依赖 +multiple client&job&依赖 +multiple client&job for ###&依赖 +client&that&依赖 +Hadoop MapReduce Master&particular job&依赖 +Hadoop MapReduce Master&subsequent job-part&依赖 +result&final output&依赖 +result&job-part&AGGREGATION +final result&processing&依赖 +we&MapReduce&依赖 +we&client&依赖 +client&Hadoop MapReduce Master&依赖 +client&job&依赖 +job&particular size&AGGREGATION +client&particular size&依赖 +MapReduce master&job&依赖 +MapReduce master&further equivalent job-part&依赖 +Map and Reduce task&use-case&依赖 +requirement&use-case&AGGREGATION +Map and Reduce task&requirement&依赖 +developer&their logic&依赖 +developer&requirement&依赖 +industry&that&依赖 +their&logic& +input datum&Map Task&依赖 +its&output& +Map&intermediate key-value pair&依赖 +Map&output&依赖 +we&which&依赖 +key-value pair&Reducer&依赖 +final output&hdf&依赖 +output&map i.e.&AGGREGATION +n number&Map and Reduce task&AGGREGATION +algorithm&minimum&依赖 +algorithm&optimized way&依赖 +’s&MapReduce phase&依赖 +’s&architecture&依赖 +its&architecture& +’s&better understanding&依赖 +better understanding&architecture&AGGREGATION +MapReduce task&2 phase i.e. map phase&依赖 +its&use& +key&kind&依赖 +id&kind&AGGREGATION +kind&address and value&AGGREGATION +key&address and value&依赖 +its&repository& +Map ( ) function&memory repository&依赖 +its&pair& +work&Job tracker&AGGREGATION +hundred&data node&AGGREGATION +work&resource&依赖 +Task Tracker&actual slave&依赖 +cluster&Map and Reduce task&依赖 +also one important component&MapReduce Architecture&AGGREGATION +daemon process&task or application&依赖 +daemon process&historical information&依赖 +log&Job History Server&依赖 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt new file mode 100644 index 0000000..794ecd1 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt @@ -0,0 +1,32 @@ +MapReduce Architecture +Last Updated : 10 Sep, 2020 +MapReduce and HDFS are the two major components of Hadoop which makes it so powerful and efficient to use. MapReduce is a programming model used for efficient processing in parallel over large data-sets in a distributed manner. The data is first split and then combined to produce the final result. The libraries for MapReduce is written in so many programming languages with various different-different optimizations. The purpose of MapReduce in Hadoop is to Map each of the jobs and then it will reduce it to equivalent tasks for providing less overhead over the cluster network and to reduce the processing power. The MapReduce task is mainly divided into two phases Map Phase and Reduce Phase. + +MapReduce Architecture: + +MapReduce-Architecture + +Components of MapReduce Architecture: +Client: The MapReduce client is the one who brings the Job to the MapReduce for processing. There can be multiple clients available that continuously send jobs for processing to the Hadoop MapReduce Manager. +Job: The MapReduce Job is the actual work that the client wanted to do which is comprised of so many smaller tasks that the client wants to process or execute. +Hadoop MapReduce Master: It divides the particular job into subsequent job-parts. +Job-Parts: The task or sub-jobs that are obtained after dividing the main job. The result of all the job-parts combined to produce the final output. +Input Data: The data set that is fed to the MapReduce for processing. +Output Data: The final result is obtained after the processing. +In MapReduce, we have a client. The client will submit the job of a particular size to the Hadoop MapReduce Master. Now, the MapReduce master will divide this job into further equivalent job-parts. These job-parts are then made available for the Map and Reduce Task. This Map and Reduce task will contain the program as per the requirement of the use-case that the particular company is solving. The developer writes their logic to fulfill the requirement that the industry requires. The input data which we are using is then fed to the Map Task and the Map will generate intermediate key-value pair as its output. The output of Map i.e. these key-value pairs are then fed to the Reducer and the final output is stored on the HDFS. There can be n number of Map and Reduce tasks made available for processing the data as per the requirement. The algorithm for Map and Reduce is made with a very optimized way such that the time complexity or space complexity is minimum. + +Let’s discuss the MapReduce phases to get a better understanding of its architecture: + + + +The MapReduce task is mainly divided into 2 phases i.e. Map phase and Reduce phase. + +Map: As the name suggests its main use is to map the input data in key-value pairs. The input to the map may be a key-value pair where the key can be the id of some kind of address and value is the actual value that it keeps. The Map() function will be executed in its memory repository on each of these input key-value pairs and generates the intermediate key-value pair which works as input for the Reducer or Reduce() function. + +Reduce: The intermediate key-value pairs that work as input for Reducer are shuffled and sort and send to the Reduce() function. Reducer aggregate or group the data based on its key-value pair as per the reducer algorithm written by the developer. +How Job tracker and the task tracker deal with MapReduce: + +Job Tracker: The work of Job tracker is to manage all the resources and all the jobs across the cluster and also to schedule each map on the Task Tracker running on the same data node since there can be hundreds of data nodes available in the cluster. + +Task Tracker: The Task Tracker can be considered as the actual slaves that are working on the instruction given by the Job Tracker. This Task Tracker is deployed on each of the nodes available in the cluster that executes the Map and Reduce task as instructed by Job Tracker. +There is also one important component of MapReduce Architecture known as Job History Server. The Job History Server is a daemon process that saves and stores historical information about the task or application, like the logs which are generated during or after the job execution are stored on Job History Server. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Architecture3.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..c3dc202614b46ce1876f001c18840b28abe7485d GIT binary patch literal 12800 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 pair&AGGREGATION +job&different type&AGGREGATION +Inputs and output&input&依赖 +Inputs and output&input&依赖 +key class&WritableComparable interface&实现 +input and output type&MapReduce job&AGGREGATION +we&detail&依赖 +MapReduce application&application&GENERALIZATION +simple application&number&依赖 +simple application&word&依赖 +number&word&AGGREGATION +number&occurence&AGGREGATION +occurence&word&AGGREGATION +simple application&number&依赖 +simple application&word&依赖 +source code wordcount.java 1&source code wordcount.java 1&依赖 +public class wordcount { 13&public class wordcount { 13&依赖 +public void map&IOException { 19&依赖 +public void map&IOException { 19&依赖 +public void map&IOException { 19&依赖 +public void map&IOException { 19&依赖 +while ( tokenizer.hasmoretokens&) ) { 22&依赖 +public void reduce&IOException { 30&依赖 +public void reduce&IOException { 30&依赖 +public void reduce&IOException { 30&依赖 +public void reduce&IOException { 30&依赖 +while ( values.hasnext ( ) ) { 32&while ( values.hasnext ( ) ) { 32&依赖 +public static void main ( string [ ] arg&Exception { 39&依赖 +root&installation and hadoop_version be&AGGREGATION +/&input&GENERALIZATION +/&output&GENERALIZATION +input&/&GENERALIZATION +cat / usr/joe/wordcount / output/part -00000 Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2 application&comma separated list&依赖 +cat / usr/joe/wordcount / output/part -00000 Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2 application&path&依赖 +comma separated list&path&AGGREGATION +current working directory&task&AGGREGATION +classpath&map&AGGREGATION +- libjars option&application&依赖 +- libjars option&jar&依赖 +archive&argument&依赖 +archive&comma separated list&依赖 +comma separated list&archive&AGGREGATION +archive&them&依赖 +link&task&依赖 +link¤t working directory&依赖 +name&archive&AGGREGATION +More detail&Commands Guide&依赖 +More detail&Commands Guide&依赖 +myarchive.zip&directory&依赖 +myarchive.zip&name " myarchive.zip "&依赖 +user&##&依赖 +user&different symbolic name&依赖 +txt&task&依赖 +txt&example&依赖 +txt&symbolic name dict1 and dict2&依赖 +archive mytar.tgz&directory&依赖 +archive mytar.tgz&name " tgzdir "&依赖 +mapper implementation ( line&time&依赖 +mapper implementation ( line&one line&依赖 +mapper implementation ( line&map method ( line&依赖 +It&line&依赖 +key-value pair&< , 1 >&AGGREGATION +It&token&依赖 +We&more&依赖 +We&map&依赖 +number&map&AGGREGATION +We&number&依赖 +WordCount&a combiner ( line&依赖 +output&local combiner (&依赖 +output&same&依赖 +output&local aggregation&依赖 +2 > The output&second map&AGGREGATION +output&value&依赖 +output&first map&AGGREGATION +< Bye&JobConf&依赖 +run method&various facet&依赖 +run method&job&依赖 +< Bye&JobConf&依赖 +< Bye&input/output format etc.&依赖 +< Bye&JobConf&依赖 +< Bye&JobConf&依赖 +< Bye&JobConf&依赖 +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +< Bye&JobConf&依赖 +< Bye&JobConf&依赖 +various facet&job&AGGREGATION +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +< Bye&JobConf&依赖 +< Bye&JobConf&依赖 +command line&line&GENERALIZATION +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +< Bye&JobConf&依赖 +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +run method&input/output path&依赖 +< Bye&input/output format etc.&依赖 +< Bye&JobConf&依赖 +< Bye&JobConf&依赖 +< Bye&input/output format etc.&依赖 +< Bye&input/output format etc.&依赖 +< Bye&JobConf&依赖 +< Bye&JobConf&依赖 +It&and&依赖 +It&jobclient.runjob ( line&依赖 +its&progress& +We&JobConf&依赖 +We&more&依赖 +We&JobConf&依赖 +reasonable amount&detail&AGGREGATION +user-facing aspect&MapReduce framework&AGGREGATION +their&jobs& +us&Mapper and Reducer interface&依赖 +application&them&实现 +We&JobConf , JobClient , Partitioner , OutputCollector , Reporter , InputFormat , OutputFormat , OutputCommitter and other&依赖 +We&other core interface&依赖 +useful feature&framework&AGGREGATION +payload application&Mapper and Reducer interface&实现 +core&job&AGGREGATION +Mapper Mapper&set&依赖 +set&intermediate key/value pair&AGGREGATION +Mapper Mapper&input key/value pair&依赖 +Mapper Mapper&intermediate key/value pair&依赖 +individual task&input record&依赖 +individual task&intermediate record&依赖 +given input pair&zero or many output pair&依赖 +Hadoop MapReduce framework&one map task&依赖 +Hadoop MapReduce framework&InputSplit&依赖 +map task&task&GENERALIZATION +framework&task&依赖 +framework&map ( writablecomparable , writable , outputcollector , reporter )&依赖 +framework&key/value pair&依赖 +application&required cleanup&依赖 +application&Closeable.close ( ) method&依赖 +Output pair&call&依赖 +Output pair&outputcollector.collect ( writablecomparable , writable )&依赖 +application&Reporter&依赖 +intermediate value&framework&依赖 +user&grouping&依赖 +number&job&依赖 +number&reduce task&依赖 +number&of&AGGREGATION +total number&partition&AGGREGATION +intermediate output&datum&依赖 +amount&datum&AGGREGATION +user&combiner&依赖 +user&jobconf.setcombinerclass ( class )&依赖 +local aggregation&intermediate output&AGGREGATION +intermediate output&amount&依赖 +intermediate , sorted output&value ) format a simple ( key-len&依赖 +intermediate , sorted output&a simple ( key-len&依赖 +intermediate , sorted output&value ) format&实现 +intermediate , sorted output&a simple ( key-len&实现 +CompressionCodec&JobConf&依赖 +block&input file&AGGREGATION +total number&block&AGGREGATION +number&input&依赖 +number&total size&依赖 +total size&input&AGGREGATION +right level¶llelism&AGGREGATION +map&execute&依赖 +map&minute&依赖 +10TB&input datum&AGGREGATION +you&input datum&依赖 +blocksize&128MB&AGGREGATION +you&10TB&依赖 +Reducer Reducer&set&依赖 +smaller set&value&AGGREGATION +intermediate value&key&依赖 +Reducer Reducer&intermediate value&依赖 +intermediate value&value&依赖 +intermediate value&smaller set&依赖 +set&intermediate value&AGGREGATION +Reducer Reducer&Reducer&GENERALIZATION +number&reduce&AGGREGATION +number&user&依赖 +number&jobconf.setnumreducetasks ( int )&依赖 +( list&value&AGGREGATION +framework&( writablecomparable , iterator , outputcollector , reporter ) method&依赖 +Reducer&3 primary phase&依赖 +Reducer&shuffle&依赖 +Shuffle Input&mapper&依赖 +sorted output&mapper&AGGREGATION +Shuffle Input&mapper&依赖 +framework&HTTP&依赖 +framework&relevant partition&依赖 +framework&HTTP&依赖 +output&mapper&AGGREGATION +framework&output&依赖 +relevant partition&output&AGGREGATION +framework&relevant partition&依赖 +framework&output&依赖 +different mapper&same key )&依赖 +one&jobconf.setoutputvaluegroupingcomparator ( class )&依赖 +one&Comparator&依赖 +output&FileSystem&依赖 +output&outputcollector.collect ( writablecomparable , writable )&依赖 +output&reduce task&AGGREGATION +output&Reducer&AGGREGATION +right number&reduce&AGGREGATION +their&round& +faster node&reduce&依赖 +faster node&reduce&依赖 +faster node&first round&依赖 +better job&load balancing&AGGREGATION +faster node&first round&依赖 +first round&reduce&AGGREGATION +cost&failure&AGGREGATION +scaling factor&a few reduce slot&依赖 +scaling factor&speculative-task&依赖 +number&reduce-task&AGGREGATION +output&output path&依赖 +output path&path&GENERALIZATION +output&case&依赖 +output&set&依赖 +output&output path&依赖 +output&set&依赖 +output&case&依赖 +output&FileSystem&依赖 +output&FileSystem&依赖 +output&map-task&AGGREGATION +framework&map-output&依赖 +Partitioner Partitioner&Partitioner&GENERALIZATION +Partitioner Partitioner&key space&依赖 +Partitioner&key&依赖 +key&intermediate map-output&AGGREGATION +Partitioner&intermediate map-output&依赖 +partitioning&key&AGGREGATION +Partitioner&partitioning&依赖 +subset&key )&AGGREGATION +this control&task&依赖 +intermediate key (&for reduction&依赖 +Reporter Reporter&MapReduce application&依赖 +Reporter Reporter&Reporter&GENERALIZATION +Reporter Reporter&progress&依赖 +Mapper and Reducer implementation&Reporter&依赖 +application&time&依赖 +significant amount&time&AGGREGATION +application&significant amount&依赖 +framework&task&依赖 +way&configuration parameter mapred.task.timeout&依赖 +application&counter&依赖 +application&Reporter&依赖 +generalization&facility&AGGREGATION +OutputCollector OutputCollector&facility&依赖 +output&job )&AGGREGATION +library&useful mapper&AGGREGATION +MapReduce job configuration&job configuration&GENERALIZATION +Job Configuration JobConf&MapReduce job configuration&依赖 +JobConf&user&依赖 +framework&job&依赖 +other parameter&rest&依赖 +other parameter&framework and/or job configuration&依赖 +job parameter&setnumreducetasks ( and int ) )&依赖 +rest&framework and/or job configuration&AGGREGATION +JobConf&input file&依赖 +JobConf&set&依赖 +set&input file&AGGREGATION +JobConf&( jobconf , path&依赖 +job task&a speculative manner ( setmapspeculativeexecution&依赖 +percentage&tasks failure&AGGREGATION +other advanced facet&job&AGGREGATION +maximum number&attempt&AGGREGATION +user&course&依赖 +user&/&依赖 +large amount&( read-only ) datum&AGGREGATION +child process&process&GENERALIZATION +TaskTracker&Mapper / Reducer task&依赖 +TaskTracker&child process&依赖 +TaskTracker&separate jvm&依赖 +parent TaskTracker&TaskTracker&GENERALIZATION +environment&parent TaskTracker&AGGREGATION +child-task&environment&依赖 +child-task&parent TaskTracker&依赖 +user&mapr&依赖 +user&child-jvm&依赖 +user&additional option&依赖 +{ map | reduce }&{ map | reduce }&依赖 +configuration parameter¶meter&GENERALIZATION +value&taskid&AGGREGATION +taskid&MapReduce task&AGGREGATION +MapReduce task&task&GENERALIZATION +it&jconsole&依赖 +start&passwordless JVM JMX agent&AGGREGATION +It&maximum heap-size&依赖 +It&map&依赖 +maximum heap-size&map&AGGREGATION +It&child-jvm&依赖 +It&additional path&依赖 +It&java.library.path&依赖 +java.library.path&child-jvm&AGGREGATION +Memory Management Users/admins&maximum virtual memory&依赖 +maximum virtual memory&launched child-task&AGGREGATION +Memory Management Users/admins&launched child-task&依赖 +child.ulimit&kilo byte kb )&依赖 +Environment&Hadoop Daemons&AGGREGATION +part&framework&AGGREGATION +datum&disk&依赖 +datum&frequency&依赖 +concurrency&operation&AGGREGATION +tuning¶meter&AGGREGATION +default limit&Virtual Memory&AGGREGATION +user&Virtual Memory&依赖 +user&default limit&依赖 +user¶meter&依赖 +user&job&依赖 +name type description mapred.task.maxvmem&number&依赖 +task&job&AGGREGATION +name type description mapred.task.maxvmem&byte&依赖 +it&number&依赖 +it&more Virtual Memory&依赖 +mapred.task.maxpmem int&number&依赖 +mapred.task.maxpmem int&byte&依赖 +over-scheduling&task&AGGREGATION +a buffer and metada&accounting buffer&依赖 +Map parameter&a buffer and metada&依赖 +contents&buffer&AGGREGATION +contents&disk&依赖 +contents&background&依赖 +map&output record&依赖 +serialization buffer&threshold&依赖 +on-disk segment&single file&依赖 +record&disk&依赖 +larger buffer&memory&依赖 +number&spill&AGGREGATION +name type description io.sort.mb int&serialization and accounting buffer&依赖 +name type description io.sort.mb int&cumulative size&依赖 +cumulative size&serialization and accounting buffer&AGGREGATION +ratio&serialization&AGGREGATION +serialized record&information&依赖 +serialized record&information&依赖 +serialized record&16 byte&依赖 +serialized record&16 byte&依赖 +serialized record&information&依赖 +16 byte&information&AGGREGATION +serialized record&16 byte&依赖 +serialized record&16 byte&依赖 +its&size& +serialized record&information&依赖 +percentage&probability&依赖 +probability&spill&AGGREGATION +exhaustion&serialization buffer&AGGREGATION +percentage&spill&依赖 +percentage&disk being&依赖 +percentage&space&AGGREGATION +higher value&disk&依赖 +higher value&number&依赖 +higher value&number&依赖 +higher value&spill&依赖 +higher value&spill&依赖 +higher value&spill&依赖 +higher value&disk&依赖 +higher value&disk&依赖 +higher value&number&依赖 +higher value&spill&依赖 +higher value&number&依赖 +higher value&disk&依赖 +contents&disk&依赖 +percentage&buffer&AGGREGATION +their&contents& +contents&background&依赖 +*&* 2 ^ 16&依赖 +maximum number&record&AGGREGATION +higher value&merge&依赖 +higher value&number&依赖 +higher value&eliminate&依赖 +number&merge&AGGREGATION +probability&map task&AGGREGATION +size&map output&AGGREGATION +map output&output&GENERALIZATION +0.66&buffer&AGGREGATION +io.sort.buffer.spill.percent&0.33&依赖 +next spill&all collect record&依赖 +remainder&buffer&AGGREGATION +threshold&other word&依赖 +threshold&trigger&依赖 +record&spill&依赖 +record&combiner&依赖 +Shuffle/Reduce Parameters&output&依赖 +Shuffle/Reduce Parameters&output&依赖 +output&memory&依赖 +intermediate compression&map output&AGGREGATION +option&merge&依赖 +option&merge&依赖 +option&frequency&依赖 +frequency&merge&AGGREGATION +option&frequency&依赖 +option&frequency&依赖 +option&merge&依赖 +number&segment&AGGREGATION +number&same time&依赖 +It&number&依赖 +It&open file and compression codec&依赖 +It&open file and compression codec&依赖 +number&open file and compression codec&AGGREGATION +It&number&依赖 +merge&several pass&依赖 +number&file&AGGREGATION +number&limit&依赖 +limit&map&依赖 +number&sorted map output&AGGREGATION +unit&partition&AGGREGATION +threshold&only frequency&依赖 +only frequency&in-memory merge&AGGREGATION +threshold&in-memory merge&依赖 +threshold&only frequency&依赖 +threshold&in-memory merge&依赖 +memory threshold&threshold&GENERALIZATION +mapred.job.shuffle.merge.percent float&memory threshold&依赖 +mapred.job.shuffle.merge.percent float&fetched map output&依赖 +mapred.job.shuffle.merge.percent float&fetched map output&依赖 +percentage&memory&AGGREGATION +mapred.job.shuffle.merge.percent float&memory threshold&依赖 +mapred.job.shuffle.merge.percent float&fetched map output&依赖 +mapred.job.shuffle.merge.percent float&memory threshold&依赖 +whose&input& +parameter&only frequency&依赖 +parameter&only frequency&依赖 +parameter&in-memory merge&依赖 +parameter&in-memory merge&依赖 +mapred.job.shuffle.input.buffer.percent float&percentage&依赖 +mapred.job.shuffle.input.buffer.percent float&memory&依赖 +it&large and numerous map output&依赖 +memory&framework&依赖 +mapred.job.reduce.input.buffer.percent float&percentage&依赖 +mapred.job.reduce.input.buffer.percent float&memory relative&依赖 +percentage&memory relative&AGGREGATION +map output&disk&依赖 +map output&default&依赖 +larger than 25 percent&memory&AGGREGATION +it&disk&依赖 +combiner&merge&依赖 +one&time&依赖 +part&intermediate merge&AGGREGATION +in-memory map output&intermediate merge&依赖 +Directory Structure&localized cache&依赖 +Directory Structure&local directory , $ { mapred.local.dir } / taskTracker /&依赖 +Directory Structure&localized cache&依赖 +Directory Structure&local directory , $ { mapred.local.dir } / taskTracker /&依赖 +It&multiple local directory&依赖 +filename&semi-random local directory&依赖 +task tracker&localized job directory&依赖 +job&user&AGGREGATION +directory&localized public distributed cache&依赖 +localized public distributed cache&user&依赖 +tasks and job&user&AGGREGATION +localized public distributed cache&tasks and job&依赖 +job&specific user&AGGREGATION +directory&localized private distributed cache&依赖 +tasks and job&specific user&AGGREGATION +localized private distributed cache&tasks and job&依赖 +localized private distributed cache&specific user&依赖 +job&other user&AGGREGATION +It&job&依赖 +It&other user&依赖 +task&space&依赖 +task&them&依赖 +task&scratch space and share file&依赖 +directory&configuration property job.local.dir&依赖 +directory&user&依赖 +directory&API JobConf.getJobLocalDir ( )&依赖 +System property&property&GENERALIZATION +It&System property&依赖 +user&directory&依赖 +user&system.getproperty&依赖 +user&directory&依赖 +user&system.getproperty&依赖 +jars directory&job jar file&依赖 +jars directory&directory&GENERALIZATION +application&file& +It&task&依赖 +It&job start&依赖 +It&jars directory&依赖 +job.jar location&api JobConf.getJar ( )&依赖 +job.jar location&location&GENERALIZATION +job.jar location&application&依赖 +task directory&directory&GENERALIZATION +task directory&structure&依赖 +current working directory&$ taskid/work&依赖 +current working directory&etc .&依赖 +jvm&$ { mapred.local.dir } / taskTracker / $ user/jobcache / $ jobid /&依赖 +jvm&$ { mapred.local.dir } / taskTracker / $ user/jobcache / $ jobid /&依赖 +jvm&temporary directory&依赖 +directory&jvm reuse&依赖 +jvm&temporary directory&依赖 +jvm&temporary directory&依赖 +jvm&$ { mapred.local.dir } / taskTracker / $ user/jobcache / $ jobid /&依赖 +jvm&temporary directory&依赖 +jvm&temporary directory&依赖 +jvm&$ { mapred.local.dir } / taskTracker / $ user/jobcache / $ jobid /&依赖 +jvm&$ { mapred.local.dir } / taskTracker / $ user/jobcache / $ jobid /&依赖 +value&temporary directory&AGGREGATION +( user&property mapred.child.tmp&依赖 +property mapred.child.tmp&mapred.child.tmp&GENERALIZATION +( user&value&依赖 +( user&temporary directory&依赖 +( user&map&依赖 +task&directory& +it&work directory&依赖 +Djava.io.tmpdir&tmp dir '&依赖 +absolute path&tmp dir '&AGGREGATION +Djava.io.tmpdir&absolute path&依赖 +child java task&option&依赖 +TMPDIR = '&tmp dir ' )&AGGREGATION +Pipes and streaming&environment variable&依赖 +Pipes and streaming&tmp dir ' )&依赖 +Pipes and streaming&TMPDIR = '&依赖 +mapred.child.tmp&value&依赖 +/ tmp Task JVM Reuse Jobs&task jvm&依赖 +number&same job )&AGGREGATION +task&same job )&AGGREGATION +number&task&AGGREGATION +One&value greater than 1 and ( int&依赖 +task&execution& +id&task&AGGREGATION +start&map input split&AGGREGATION +number&temporary output directory note&依赖 +execution&streaming job&AGGREGATION +mapred.jar string job.jar location&string task&依赖 +mapred.jar string job.jar location&string task&依赖 +name&" mapred " parameter&AGGREGATION +mapred.jar string job.jar location&string task&依赖 +name&streaming job&依赖 +number&byte&AGGREGATION +streaming job&job&GENERALIZATION +name&execution&依赖 +job&mapper/reducer& +task logs standard output ( stdout ) and error ( stderr&task&AGGREGATION +native library&task&依赖 +native library&task&依赖 +native library&task&依赖 +child-jvm&java.library.path and LD_LIBRARY_PATH&依赖 +child-jvm¤t working directory&依赖 +its&directory& +cached library&System.loadLibrary or System.load&依赖 +More detail&native_libraries.html&依赖 +user-job&primary interface&依赖 +user-job&JobTracker&依赖 +component-tasks&reports& +cluster&information& +their&progress& +input and output specification&job&AGGREGATION +DistributedCache&job&AGGREGATION +job&jar& +Job history file&user specified directory hadoop.job.history.user.location&依赖 +file&specified directory&依赖 +file&" _ logs/history /&依赖 +they&default&依赖 +command&job detail&依赖 +User&history logs summary&依赖 +User&command $ bin/hadoop job&依赖 +history&output directory listing&依赖 +history&filter log file&依赖 +history&output directory listing&依赖 +history&OutputLogFilter&依赖 +history&filter log file&依赖 +history&OutputLogFilter&依赖 +user&application&依赖 +Job Authorization Job level authorization and queue level authorization&cluster&依赖 +user&job detail&依赖 +access control check&JobTracker&依赖 +access control check&user&依赖 +job submitter&job&依赖 +job submitter&access control list&依赖 +job submitter&configuration property&依赖 +owner mapred.queue.queue-name .&access&依赖 +queue administrator&queue&AGGREGATION +owner mapred.queue.queue-name .&access&依赖 +job&owner& +job&queue&依赖 +job view ACL&user&依赖 +job view ACL&configured mapreduce.job.acl-view-job&依赖 +job level counter task level counter task&web ui other information&依赖 +its&profile& +job level counter task level counter task&user&依赖 +JobTracker&information& +job level counter task level counter task&web ui other information&依赖 +its&status& +job level counter task level counter task&job&依赖 +job level counter task level counter task&status&依赖 +job level counter task level counter task&status&依赖 +job level counter task level counter task&user&依赖 +tasks&task& +job level counter task level counter task&job&依赖 +job modification ACL&user&依赖 +job modification ACL&configured mapreduce.job.acl-modify-job&依赖 +priority&job&AGGREGATION +operation&queue level acl&依赖 +operation&queue level acl&依赖 +caller&operation&依赖 +he/she&queue admin acl or job modification acl&依赖 +part&queue admin acl or job modification acl&AGGREGATION +format&job level ACL&AGGREGATION +Job Control Users&complex task&依赖 +output&turn&依赖 +output&distributed file-system&依赖 +output&next job&依赖 +output&distributed file-system&依赖 +output&input&依赖 +various job-control option be&such case&依赖 +various job-control option be&such case&依赖 +submitjob ( jobconf )&job&依赖 +jobconf.setjobendnotificationuri ( string )&polling&依赖 +Kerberos&command& +user&secure cluster&依赖 +user&Job Credentials&依赖 +user&' kinit command&依赖 +Job Credentials&Credentials&GENERALIZATION +we&scalability concern&依赖 +we&' ticket&依赖 +we&MapReduce job&依赖 +Kerberos&tickets& +client&Kerberos& +we&delegation token&依赖 +we&them&依赖 +part&job submission&AGGREGATION +delegation token&hdf&依赖 +HDFS system&FileInputFormats&依赖 +hdf&staging directory&依赖 +Other application&configuration " mapreduce.job.hdfs-servers "&依赖 +comma separated list&file system name&AGGREGATION +token&part&依赖 +token&JobTracker&依赖 +token&Credentials&依赖 +token&job submission&依赖 +we&MapReduce delegation token&依赖 +task&job&依赖 +task&JobTracker&依赖 +task&MapReduce delegation token&依赖 +delegation token&JobClient.getDelegationToken&依赖 +delegation token&token&GENERALIZATION +delegation token&API&依赖 +obtained token&credentials&依赖 +credentials&part&依赖 +credentials&JobTracker&依赖 +part&job submission process&AGGREGATION +credentials&job submission process&依赖 +JobTracker&its filesystem (&依赖 +JobTracker&its filesystem (&依赖 +JobTracker&hdf&依赖 +JobTracker&hdf&依赖 +JobTracker&tokens and secret&依赖 +JobTracker&tokens and secret&依赖 +JobTracker&tokens and secret&依赖 +its&filesystem& +JobTracker&its filesystem (&依赖 +JobTracker&hdf&依赖 +TaskTracker&part job localization&依赖 +TaskTracker&file&依赖 +task&environment variable&依赖 +task&HADOOP_TOKEN_FILE_LOCATION&依赖 +task&configuration " mapreduce.job.credentials.binary "&依赖 +HDFS delegation token&JobTracker&依赖 +task&job&依赖 +task&job&依赖 +whose&tasks& +job&same token&依赖 +arbitrary secret&task&依赖 +arbitrary secret&access other third party service&依赖 +arbitrary secret&HDFS delegation token&依赖 +arbitrary secret&job submission&依赖 +Mapper/Reducer class&JobConfigurable&实现 +similar thing&new MapReduce API&依赖 +similar thing&Mapper.setup method&依赖 +task&api&依赖 +task&api&依赖 +task&secret&依赖 +task&secret&依赖 +Job Input InputFormat&input-specification&依赖 +Job Input InputFormat&MapReduce job&依赖 +InputFormat&job to&AGGREGATION +input-specification&job&AGGREGATION +input file&file&GENERALIZATION +sub-class&FileInputFormat&AGGREGATION +default behavior&input&依赖 +default behavior&file-based InputFormat implementation&AGGREGATION +total size&input file&AGGREGATION +byte&input file&AGGREGATION +FileSystem blocksize&input file&AGGREGATION +logical split&many application&依赖 +logical split&many application&依赖 +application&RecordReader&实现 +application&such case&实现 +record-oriented view&logical InputSplit&AGGREGATION +TextInputFormat&given job&依赖 +framework&input-file&依赖 +framework&input-file with ###&依赖 +them&appropriate CompressionCodec&依赖 +its&entirety& +compressed file&single mapper&依赖 +compressed file&entirety&依赖 +InputSplit InputSplit&InputSplit&GENERALIZATION +InputSplit InputSplit&datum&依赖 +it&RecordReader&依赖 +InputSplit&byte-oriented view&依赖 +byte-oriented view&input&AGGREGATION +responsibility&RecordReader&AGGREGATION +InputSplit&input&依赖 +It&path&依赖 +It&logical split&依赖 +It&map.input.file&依赖 +path&input file&AGGREGATION +RecordReader RecordReader&InputSplit&依赖 +RecordReader RecordReader&< key , value > pair&依赖 +RecordReader RecordReader&RecordReader&GENERALIZATION +RecordReader&byte-oriented view&依赖 +RecordReader&input&依赖 +RecordReader&responsibility&依赖 +RecordReader&processing record boundary&依赖 +Job Output OutputFormat&MapReduce job&依赖 +Job Output OutputFormat&output-specification&依赖 +OutputFormat&job to&AGGREGATION +output-specification&job&AGGREGATION +output file&job&AGGREGATION +Output file&FileSystem&依赖 +commit&task output&AGGREGATION +OutputCommitter OutputCommitter&OutputCommitter&GENERALIZATION +OutputCommitter OutputCommitter&MapReduce job&依赖 +OutputCommitter OutputCommitter&commit&依赖 +OutputCommitter&job to&AGGREGATION +MapReduce framework&OutputCommitter&依赖 +MapReduce framework&job to&依赖 +initialization&job&AGGREGATION +Job setup&separate task&依赖 +job&state&依赖 +Job cleanup&separate task&依赖 +Job cleanup&end&依赖 +Job cleanup&job&依赖 +end&job&AGGREGATION +Task setup&same task&依赖 +part&same task&AGGREGATION +Task setup&part&依赖 +Task setup&task initialization&依赖 +task&exception block )&依赖 +Job setup/cleanup task&slot&依赖 +Job setup/cleanup task&map&依赖 +JobCleanup task&task&GENERALIZATION +JobCleanup task&highest priority&依赖 +two instance&same Mapper or Reducer&AGGREGATION +application-writer&using&依赖 +application-writer&unique name&依赖 +output&task-attempt&AGGREGATION +MapReduce framework&_ $ { taskid&依赖 +MapReduce framework&FileSystem&依赖 +successful completion&task-attempt&AGGREGATION +file&task-attempt&依赖 +file&successful completion&依赖 +file&$ { mapred.output.dir }&依赖 +sub-directory&unsuccessful task-attempt&AGGREGATION +framework&sub-directory&依赖 +framework&sub-directory&依赖 +framework&unsuccessful task-attempt&依赖 +framework&unsuccessful task-attempt&依赖 +process&application&依赖 +execution&task&AGGREGATION +$ { mapred.work.output.dir }&task&AGGREGATION +advantage&feature&AGGREGATION +framework&succesful task-attempt&依赖 +application-writer&advantage&依赖 +framework&them&依赖 +application-writer&feature&依赖 +value&MapReduce framework&依赖 +value&$ { mapred.work.output.dir }&AGGREGATION +execution&particular task-attempt&AGGREGATION +output&hdf&依赖 +map&job&AGGREGATION +output&case&依赖 +output&hdf&依赖 +output&case&依赖 +RecordWriter RecordWriter&output < key , value > pair&依赖 +RecordWriter RecordWriter&output file&依赖 +output file&file&GENERALIZATION +RecordWriter implementation&FileSystem&依赖 +RecordWriter implementation&job output&依赖 +Other Useful Features Submitting Jobs&queue&依赖 +Other Useful Features Submitting Jobs&job&依赖 +collection&job&AGGREGATION +queue&acl&依赖 +queue&example&依赖 +who&job&依赖 +who&them&依赖 +Hadoop&single mandatory queue&依赖 +mapred.queue.names property&Hadoop site configuration&AGGREGATION +Queue name&Hadoop site configuration&依赖 +Queue name&mapred.queue.names property&依赖 +job scheduler&support multiple queue&依赖 +job scheduler&support multiple queue&依赖 +job&queue&依赖 +it&' default ' queue&依赖 +job&associated queue name&依赖 +'&queue& +Counters counter&global counter&依赖 +group&type Counters.Group&AGGREGATION +counter&type Counters.Group&依赖 +counter&particular Enum&AGGREGATION +counter&group&依赖 +application&type enum )&依赖 +application&arbitrary counter (&依赖 +arbitrary counter (&type enum )&AGGREGATION +DistributedCache DistributedCache&application-specific , large , read-only file&依赖 +DistributedCache DistributedCache&DistributedCache&GENERALIZATION +application&file&依赖 +/&/&GENERALIZATION +job&node&依赖 +framework&task&依赖 +framework&necessary file&依赖 +framework&necessary file&依赖 +slave node&node&GENERALIZATION +efficiency&fact&依赖 +Its&efficiency& +DistributedCache&cached file&依赖 +DistributedCache&modification timestamp&依赖 +modification timestamp&cached file&AGGREGATION +cache file&application or externally&依赖 +archive&slave node&依赖 +{ file&| archives }&依赖 +they&comma separated path&依赖 +property&distributedcache.addcachearchive ( uri , conf )&依赖 +property&api distributedcache.addcachefile ( uri , conf )&依赖 +user&DistributedCache&依赖 +name&symlink&AGGREGATION +DistributedCache&URI&依赖 +DistributedCache&URI&依赖 +DistributedCache&fragment&依赖 +DistributedCache&URI&依赖 +fragment&URI&AGGREGATION +DistributedCache&fragment&依赖 +DistributedCache&fragment&依赖 +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +symlink name&name&GENERALIZATION +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +uri hdf&symlink name&依赖 +task&cwd& +uri hdf&lib.so&依赖 +uri hdf&symlink name&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +uri hdf&lib.so&依赖 +DistributedCache&reduce&依赖 +DistributedCache&use&依赖 +DistributedCache&rudimentary software distribution mechanism&依赖 +classpath&child-jvm&AGGREGATION +distributedcache.addarchivetoclasspath ( path&cache files/jars&依赖 +directory&task&AGGREGATION +they&slave node&依赖 +whose job&file&依赖 +whose&jobs& +Private " DistributedCache file&local directory&依赖 +file&specific user&依赖 +file&tasks and job&依赖 +its&permissions& +virtue&permission&AGGREGATION +directory path&lookup&依赖 +file&world readable access&依赖 +directory path&lookup&依赖 +directory path&world executable access&依赖 +directory path&world executable access&依赖 +directory path&path&GENERALIZATION +" Public " DistributedCache file&global directory&依赖 +file&tasks and job&依赖 +file&user&依赖 +file&slave&依赖 +file&user&依赖 +Tool The Tool interface&handling&依赖 +handling&generic Hadoop command-line option&AGGREGATION +Tool The Tool interface&generic Hadoop command-line option&依赖 +Tool&MapReduce tool or application&依赖 +application&standard command-line option&依赖 +its&arguments& +handling&standard command-line option&AGGREGATION +application&handling&依赖 +TaskTracker&directory& +$ cd / taskTracker /&$ bin/hadoop org.apache.hadoop.mapred.IsolationRunner&依赖 +failed task&node&依赖 +IsolationRunner&same input&依赖 +IsolationRunner&single jvm&依赖 +IsolationRunner&failed task&依赖 +IsolationRunner&map task&依赖 +3 ) sample&built-in java profiler&AGGREGATION +sample&map&AGGREGATION +User&profiler information&依赖 +profiler information&user log directory&依赖 +profiling&default&依赖 +profiling&job&依赖 +she/he&configuration property mapred.task.profile&依赖 +configuration property&property&GENERALIZATION +{ maps |&MapReduce task&依赖 +{ maps |&range&依赖 +{ maps |&reduce }&依赖 +range&MapReduce task&AGGREGATION +specified range&default&依赖 +User&profiler configuration argument&依赖 +string&a %&依赖 +it&name&依赖 +it&profiling output file&依赖 +name&profiling output file&AGGREGATION +parameter&command line&依赖 +parameter&task child JVM&依赖 +file = %&file = %&依赖 +user&debug script&依赖 +task&stdout& +output&console diagnostic&依赖 +script&stdout& +part&job uus&AGGREGATION +we&debug script&依赖 +user&DistributedCache&依赖 +a quick way&value&依赖 +a quick way&property&依赖 +a quick way&map&依赖 +debug script&command-line option&依赖 +debug script&streaming mode&依赖 +streaming mode&mode&GENERALIZATION +task&files& +Pipes program&c++ program name&依赖 +Pipes program&command&依赖 +Pipes program&fifth argument&依赖 +their&dependencies& +set&MapReduce job&AGGREGATION +utility&MapReduce job&依赖 +utility&set&依赖 +job-outputs i.e. output&reduce&AGGREGATION +both performance ( zlib ) and non-availability&Java library&AGGREGATION +native implementation&above compression codec&AGGREGATION +reason&both performance ( zlib ) and non-availability&AGGREGATION +their&usage& +compression&intermediate map-output&AGGREGATION +Intermediate Outputs application&compression&依赖 +Intermediate Outputs application&intermediate map-output&依赖 +Intermediate Outputs application&intermediate map-output&依赖 +Intermediate Outputs application&compression&依赖 +job outputs application&compression&依赖 +job outputs application&fileoutputformat.setcompressoutput ( jobconf , boolean ) apus&依赖 +compression&job-output&AGGREGATION +job outputs application&fileoutputformat.setoutputcompressorclass ( jobconf&依赖 +job outputs application&class ) apus and fileoutputformat.setoutputcompressorclass ( jobconf&依赖 +require sequencefile.compressiontype ( i.e. record&sequencefileoutputformat.setoutputcompressiontype ( jobconf , sequencefile.compressiontype ) apus&依赖 +certain set&bad input record&AGGREGATION +application&feature&依赖 +application&SkipBadRecords class&依赖 +map task crash&certain input&依赖 +map task crash&certain input&依赖 +user&bug&依赖 +source code&which&依赖 +bug&example&依赖 +task&such case&依赖 +task&multiple attempt&依赖 +small portion&datum&AGGREGATION +feature&default&依赖 +'&certain number&依赖 +'&map failure&依赖 +'&mode&依赖 +certain number&map failure&AGGREGATION +map task&record&依赖 +' skip mode '&' skip mode '&依赖 +map task&range&依赖 +range&record&AGGREGATION +framework&processed record counter&依赖 +skipbadrecords.counter _ map_processed_records and skipbadrecords.counter _ reduce_processed_groups&skipbadrecords.counter _ map_processed_records and skipbadrecords.counter _ reduce_processed_groups&依赖 +counter&framework&依赖 +what record range&task&依赖 +what record range&what record range&依赖 +range&further attempt&依赖 +number&record&AGGREGATION +processed record counter&application&依赖 +application&processing&依赖 +their&processing& +framework&additional record&依赖 +framework&bad record&依赖 +framework&bad record&依赖 +framework&additional record&依赖 +user&skipped record&依赖 +number&skipped record&AGGREGATION +user&number&依赖 +user&skipped record&依赖 +user&skipped record&依赖 +user&number&依赖 +user&number&依赖 +framework&range&依赖 +range&skipped record&AGGREGATION +framework&binary search-like approach&依赖 +framework&skipped record&依赖 +skipped range&two half&依赖 +framework&bad record&依赖 +number&task attempt&AGGREGATION +Skipped record&sequence file format&依赖 +Skipped record&hdf&依赖 +Skipped record&later analysis&依赖 +location&skipbadrecords.setskipoutputpath ( jobconf , path )&依赖 +many&feature&AGGREGATION +more complete WordCount&feature&依赖 +more complete WordCount&many&依赖 +it&pseudo-distributed or fully-distributed Hadoop installation&依赖 +public class WordCount&Tool { 14&实现 +private boolean casesensitive = true ; 23&private boolean casesensitive = true ; 23&依赖 +private long numrecord = 0&26&依赖 +private long numrecord = 0&private long numrecord = 0&依赖 +public void configure ( jobconf job&) { 29&依赖 +JobConf&job&GENERALIZATION +( job.getboolean&false ) ) { 33&依赖 +( job.getboolean&false ) ) { 33&依赖 +private void parseskipfile ( path patternsfile&) { 46&依赖 +file&+& +public void map&) throw ioexception { 58&依赖 +public void map&) throw ioexception { 58&依赖 +public void map&) throw ioexception { 58&依赖 +public void map&) throw ioexception { 58&依赖 +while ( tokenizer.hasmoretokens&) ) { 66&依赖 +100 ) == 0 ) { 72&( ( + + numrecord&依赖 +100 ) == 0 ) { 72&100 ) == 0 ) { 72&依赖 +100 ) == 0 ) { 72&( ( + + numrecord&依赖 +100 ) == 0 ) { 72&100 ) == 0 ) { 72&依赖 +100 ) == 0 ) { 72&100 ) == 0 ) { 72&依赖 +100 ) == 0 ) { 72&( ( + + numrecord&依赖 +intwritable > { 78&intwritable > { 78&依赖 +public void reduce&) throw ioexception { 79&依赖 +public void reduce&) throw ioexception { 79&依赖 +public void reduce&) throw ioexception { 79&依赖 +public void reduce&) throw ioexception { 79&依赖 +while ( values.hasnext ( ) ) { 81&while ( values.hasnext ( ) ) { 81&依赖 +public int&Exception { 88&依赖 +public int&Exception { 88&依赖 +public int&Exception { 88&依赖 +} else { 107&} else { 107&依赖 +public static void main ( string [ ] arg&Exception { 119&依赖 +they&output&依赖 +plug-in a pattern-file&word-pattern&依赖 +let&DistributedCache&依赖 +let&DistributedCache&依赖 +let&plug-in a pattern-file&依赖 +let&plug-in a pattern-file&依赖 +second version&previous one&依赖 +2 highlight&usr/joe/wordcount / output/part -00000 bye 1 goodbye 1 hadoop 2 hello 2 world&依赖 +second version&WordCount&AGGREGATION +second version&previous one&依赖 +application&configuration parameter&依赖 +configure method&mapper ( and reducer ) implementation ( line&AGGREGATION +it&word-pattern&依赖 +it&user&依赖 +it&skip&依赖 +utility&Tool interface&AGGREGATION +application&counters ( line 68 )&依赖 +they&application-specific status information&依赖 +they&Reporter instance&依赖 +registered trademark&Sun Microsystems , Inc.&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt new file mode 100644 index 0000000..f5c558f --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt @@ -0,0 +1,853 @@ +Purpose +This document comprehensively describes all user-facing facets of the Hadoop MapReduce framework and serves as a tutorial. + +Prerequisites +Ensure that Hadoop is installed, configured and is running. More details: + +Single Node Setup for first-time users. +Cluster Setup for large, distributed clusters. +Overview +Hadoop MapReduce is a software framework for easily writing applications which process vast amounts of data (multi-terabyte data-sets) in-parallel on large clusters (thousands of nodes) of commodity hardware in a reliable, fault-tolerant manner. + +A MapReduce job usually splits the input data-set into independent chunks which are processed by the map tasks in a completely parallel manner. The framework sorts the outputs of the maps, which are then input to the reduce tasks. Typically both the input and the output of the job are stored in a file-system. The framework takes care of scheduling tasks, monitoring them and re-executes the failed tasks. + +Typically the compute nodes and the storage nodes are the same, that is, the MapReduce framework and the Hadoop Distributed File System (see HDFS Architecture Guide) are running on the same set of nodes. This configuration allows the framework to effectively schedule tasks on the nodes where data is already present, resulting in very high aggregate bandwidth across the cluster. + +The MapReduce framework consists of a single master JobTracker and one slave TaskTracker per cluster-node. The master is responsible for scheduling the jobs' component tasks on the slaves, monitoring them and re-executing the failed tasks. The slaves execute the tasks as directed by the master. + +Minimally, applications specify the input/output locations and supply map and reduce functions via implementations of appropriate interfaces and/or abstract-classes. These, and other job parameters, comprise the job configuration. The Hadoop job client then submits the job (jar/executable etc.) and configuration to the JobTracker which then assumes the responsibility of distributing the software/configuration to the slaves, scheduling tasks and monitoring them, providing status and diagnostic information to the job-client. + +Although the Hadoop framework is implemented in JavaTM, MapReduce applications need not be written in Java. + +Hadoop Streaming is a utility which allows users to create and run jobs with any executables (e.g. shell utilities) as the mapper and/or the reducer. +Hadoop Pipes is a SWIG- compatible C++ API to implement MapReduce applications (non JNITM based). +Inputs and Outputs +The MapReduce framework operates exclusively on pairs, that is, the framework views the input to the job as a set of pairs and produces a set of pairs as the output of the job, conceivably of different types. + +The key and value classes have to be serializable by the framework and hence need to implement the Writable interface. Additionally, the key classes have to implement the WritableComparable interface to facilitate sorting by the framework. + +Input and Output types of a MapReduce job: + +(input) -> map -> -> combine -> -> reduce -> (output) + +Example: WordCount v1.0 +Before we jump into the details, lets walk through an example MapReduce application to get a flavour for how they work. + +WordCount is a simple application that counts the number of occurences of each word in a given input set. + +This works with a local-standalone, pseudo-distributed or fully-distributed Hadoop installation (Single Node Setup). + +Source Code +WordCount.java +1. package org.myorg; +2. +3. import java.io.IOException; +4. import java.util.*; +5. +6. import org.apache.hadoop.fs.Path; +7. import org.apache.hadoop.conf.*; +8. import org.apache.hadoop.io.*; +9. import org.apache.hadoop.mapred.*; +10. import org.apache.hadoop.util.*; +11. +12. public class WordCount { +13. +14. public static class Map extends MapReduceBase implements Mapper { +15. private final static IntWritable one = new IntWritable(1); +16. private Text word = new Text(); +17. +18. public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException { +19. String line = value.toString(); +20. StringTokenizer tokenizer = new StringTokenizer(line); +21. while (tokenizer.hasMoreTokens()) { +22. word.set(tokenizer.nextToken()); +23. output.collect(word, one); +24. } +25. } +26. } +27. +28. public static class Reduce extends MapReduceBase implements Reducer { +29. public void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException { +30. int sum = 0; +31. while (values.hasNext()) { +32. sum += values.next().get(); +33. } +34. output.collect(key, new IntWritable(sum)); +35. } +36. } +37. +38. public static void main(String[] args) throws Exception { +39. JobConf conf = new JobConf(WordCount.class); +40. conf.setJobName("wordcount"); +41. +42. conf.setOutputKeyClass(Text.class); +43. conf.setOutputValueClass(IntWritable.class); +44. +45. conf.setMapperClass(Map.class); +46. conf.setCombinerClass(Reduce.class); +47. conf.setReducerClass(Reduce.class); +48. +49. conf.setInputFormat(TextInputFormat.class); +50. conf.setOutputFormat(TextOutputFormat.class); +51. +52. FileInputFormat.setInputPaths(conf, new Path(args[0])); +53. FileOutputFormat.setOutputPath(conf, new Path(args[1])); +54. +55. JobClient.runJob(conf); +57. } +58. } +59. +Usage +Assuming HADOOP_HOME is the root of the installation and HADOOP_VERSION is the Hadoop version installed, compile WordCount.java and create a jar: + +$ mkdir wordcount_classes +$ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar -d wordcount_classes WordCount.java +$ jar -cvf /usr/joe/wordcount.jar -C wordcount_classes/ . + +Assuming that: + +/usr/joe/wordcount/input - input directory in HDFS +/usr/joe/wordcount/output - output directory in HDFS +Sample text-files as input: + +$ bin/hadoop dfs -ls /usr/joe/wordcount/input/ +/usr/joe/wordcount/input/file01 +/usr/joe/wordcount/input/file02 + +$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file01 +Hello World Bye World + +$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file02 +Hello Hadoop Goodbye Hadoop + +Run the application: + +$ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output + +Output: + +$ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000 +Bye 1 +Goodbye 1 +Hadoop 2 +Hello 2 +World 2 +Applications can specify a comma separated list of paths which would be present in the current working directory of the task using the option -files. The -libjars option allows applications to add jars to the classpaths of the maps and reduces. The option -archives allows them to pass comma separated list of archives as arguments. These archives are unarchived and a link with name of the archive is created in the current working directory of tasks. More details about the command line options are available at Commands Guide. + +Running wordcount example with -libjars, -files and -archives: +hadoop jar hadoop-examples.jar wordcount -files cachefile.txt -libjars mylib.jar -archives myarchive.zip input output Here, myarchive.zip will be placed and unzipped into a directory by the name "myarchive.zip". + +Users can specify a different symbolic name for files and archives passed through -files and -archives option, using #. + +For example, hadoop jar hadoop-examples.jar wordcount -files dir1/dict.txt#dict1,dir2/dict.txt#dict2 -archives mytar.tgz#tgzdir input output Here, the files dir1/dict.txt and dir2/dict.txt can be accessed by tasks using the symbolic names dict1 and dict2 respectively. The archive mytar.tgz will be placed and unarchived into a directory by the name "tgzdir". + +Walk-through +The WordCount application is quite straight-forward. + +The Mapper implementation (lines 14-26), via the map method (lines 18-25), processes one line at a time, as provided by the specified TextInputFormat (line 49). It then splits the line into tokens separated by whitespaces, via the StringTokenizer, and emits a key-value pair of < , 1>. + +For the given sample input the first map emits: +< Hello, 1> +< World, 1> +< Bye, 1> +< World, 1> +The second map emits: +< Hello, 1> +< Hadoop, 1> +< Goodbye, 1> +< Hadoop, 1> +We'll learn more about the number of maps spawned for a given job, and how to control them in a fine-grained manner, a bit later in the tutorial. + +WordCount also specifies a combiner (line 46). Hence, the output of each map is passed through the local combiner (which is same as the Reducer as per the job configuration) for local aggregation, after being sorted on the keys. + +The output of the first map: +< Bye, 1> +< Hello, 1> +< World, 2> +The output of the second map: +< Goodbye, 1> +< Hadoop, 2> +< Hello, 1> +The Reducer implementation (lines 28-36), via the reduce method (lines 29-35) just sums up the values, which are the occurence counts for each key (i.e. words in this example). + +Thus the output of the job is: +< Bye, 1> +< Goodbye, 1> +< Hadoop, 2> +< Hello, 2> +< World, 2> +The run method specifies various facets of the job, such as the input/output paths (passed via the command line), key/value types, input/output formats etc., in the JobConf. It then calls the JobClient.runJob (line 55) to submit the and monitor its progress. + +We'll learn more about JobConf, JobClient, Tool and other interfaces and classes a bit later in the tutorial. + +MapReduce - User Interfaces +This section provides a reasonable amount of detail on every user-facing aspect of the MapReduce framework. This should help users implement, configure and tune their jobs in a fine-grained manner. However, please note that the javadoc for each class/interface remains the most comprehensive documentation available; this is only meant to be a tutorial. + +Let us first take the Mapper and Reducer interfaces. Applications typically implement them to provide the map and reduce methods. + +We will then discuss other core interfaces including JobConf, JobClient, Partitioner, OutputCollector, Reporter, InputFormat, OutputFormat, OutputCommitter and others. + +Finally, we will wrap up by discussing some useful features of the framework such as the DistributedCache, IsolationRunner etc. + +Payload +Applications typically implement the Mapper and Reducer interfaces to provide the map and reduce methods. These form the core of the job. + +Mapper +Mapper maps input key/value pairs to a set of intermediate key/value pairs. + +Maps are the individual tasks that transform input records into intermediate records. The transformed intermediate records do not need to be of the same type as the input records. A given input pair may map to zero or many output pairs. + +The Hadoop MapReduce framework spawns one map task for each InputSplit generated by the InputFormat for the job. + +Overall, Mapper implementations are passed the JobConf for the job via the JobConfigurable.configure(JobConf) method and override it to initialize themselves. The framework then calls map(WritableComparable, Writable, OutputCollector, Reporter) for each key/value pair in the InputSplit for that task. Applications can then override the Closeable.close() method to perform any required cleanup. + +Output pairs do not need to be of the same types as input pairs. A given input pair may map to zero or many output pairs. Output pairs are collected with calls to OutputCollector.collect(WritableComparable,Writable). + +Applications can use the Reporter to report progress, set application-level status messages and update Counters, or just indicate that they are alive. + +All intermediate values associated with a given output key are subsequently grouped by the framework, and passed to the Reducer(s) to determine the final output. Users can control the grouping by specifying a Comparator via JobConf.setOutputKeyComparatorClass(Class). + +The Mapper outputs are sorted and then partitioned per Reducer. The total number of partitions is the same as the number of reduce tasks for the job. Users can control which keys (and hence records) go to which Reducer by implementing a custom Partitioner. + +Users can optionally specify a combiner, via JobConf.setCombinerClass(Class), to perform local aggregation of the intermediate outputs, which helps to cut down the amount of data transferred from the Mapper to the Reducer. + +The intermediate, sorted outputs are always stored in a simple (key-len, key, value-len, value) format. Applications can control if, and how, the intermediate outputs are to be compressed and the CompressionCodec to be used via the JobConf. + +How Many Maps? +The number of maps is usually driven by the total size of the inputs, that is, the total number of blocks of the input files. + +The right level of parallelism for maps seems to be around 10-100 maps per-node, although it has been set up to 300 maps for very cpu-light map tasks. Task setup takes awhile, so it is best if the maps take at least a minute to execute. + +Thus, if you expect 10TB of input data and have a blocksize of 128MB, you'll end up with 82,000 maps, unless setNumMapTasks(int) (which only provides a hint to the framework) is used to set it even higher. + +Reducer +Reducer reduces a set of intermediate values which share a key to a smaller set of values. + +The number of reduces for the job is set by the user via JobConf.setNumReduceTasks(int). + +Overall, Reducer implementations are passed the JobConf for the job via the JobConfigurable.configure(JobConf) method and can override it to initialize themselves. The framework then calls reduce(WritableComparable, Iterator, OutputCollector, Reporter) method for each pair in the grouped inputs. Applications can then override the Closeable.close() method to perform any required cleanup. + +Reducer has 3 primary phases: shuffle, sort and reduce. + +Shuffle +Input to the Reducer is the sorted output of the mappers. In this phase the framework fetches the relevant partition of the output of all the mappers, via HTTP. + +Sort +The framework groups Reducer inputs by keys (since different mappers may have output the same key) in this stage. + +The shuffle and sort phases occur simultaneously; while map-outputs are being fetched they are merged. + +Secondary Sort +If equivalence rules for grouping the intermediate keys are required to be different from those for grouping keys before reduction, then one may specify a Comparator via JobConf.setOutputValueGroupingComparator(Class). Since JobConf.setOutputKeyComparatorClass(Class) can be used to control how intermediate keys are grouped, these can be used in conjunction to simulate secondary sort on values. + +Reduce +In this phase the reduce(WritableComparable, Iterator, OutputCollector, Reporter) method is called for each pair in the grouped inputs. + +The output of the reduce task is typically written to the FileSystem via OutputCollector.collect(WritableComparable, Writable). + +Applications can use the Reporter to report progress, set application-level status messages and update Counters, or just indicate that they are alive. + +The output of the Reducer is not sorted. + +How Many Reduces? +The right number of reduces seems to be 0.95 or 1.75 multiplied by ( * mapred.tasktracker.reduce.tasks.maximum). + +With 0.95 all of the reduces can launch immediately and start transfering map outputs as the maps finish. With 1.75 the faster nodes will finish their first round of reduces and launch a second wave of reduces doing a much better job of load balancing. + +Increasing the number of reduces increases the framework overhead, but increases load balancing and lowers the cost of failures. + +The scaling factors above are slightly less than whole numbers to reserve a few reduce slots in the framework for speculative-tasks and failed tasks. + +Reducer NONE +It is legal to set the number of reduce-tasks to zero if no reduction is desired. + +In this case the outputs of the map-tasks go directly to the FileSystem, into the output path set by setOutputPath(Path). The framework does not sort the map-outputs before writing them out to the FileSystem. + +Partitioner +Partitioner partitions the key space. + +Partitioner controls the partitioning of the keys of the intermediate map-outputs. The key (or a subset of the key) is used to derive the partition, typically by a hash function. The total number of partitions is the same as the number of reduce tasks for the job. Hence this controls which of the m reduce tasks the intermediate key (and hence the record) is sent to for reduction. + +HashPartitioner is the default Partitioner. + +Reporter +Reporter is a facility for MapReduce applications to report progress, set application-level status messages and update Counters. + +Mapper and Reducer implementations can use the Reporter to report progress or just indicate that they are alive. In scenarios where the application takes a significant amount of time to process individual key/value pairs, this is crucial since the framework might assume that the task has timed-out and kill that task. Another way to avoid this is to set the configuration parameter mapred.task.timeout to a high-enough value (or even set it to zero for no time-outs). + +Applications can also update Counters using the Reporter. + +OutputCollector +OutputCollector is a generalization of the facility provided by the MapReduce framework to collect data output by the Mapper or the Reducer (either the intermediate outputs or the output of the job). + +Hadoop MapReduce comes bundled with a library of generally useful mappers, reducers, and partitioners. + +Job Configuration +JobConf represents a MapReduce job configuration. + +JobConf is the primary interface for a user to describe a MapReduce job to the Hadoop framework for execution. The framework tries to faithfully execute the job as described by JobConf, however: + +f Some configuration parameters may have been marked as final by administrators and hence cannot be altered. +While some job parameters are straight-forward to set (e.g. setNumReduceTasks(int)), other parameters interact subtly with the rest of the framework and/or job configuration and are more complex to set (e.g. setNumMapTasks(int)). +JobConf is typically used to specify the Mapper, combiner (if any), Partitioner, Reducer, InputFormat, OutputFormat and OutputCommitter implementations. JobConf also indicates the set of input files (setInputPaths(JobConf, Path...) /addInputPath(JobConf, Path)) and (setInputPaths(JobConf, String) /addInputPaths(JobConf, String)) and where the output files should be written (setOutputPath(Path)). + +Optionally, JobConf is used to specify other advanced facets of the job such as the Comparator to be used, files to be put in the DistributedCache, whether intermediate and/or job outputs are to be compressed (and how), debugging via user-provided scripts (setMapDebugScript(String)/setReduceDebugScript(String)) , whether job tasks can be executed in a speculative manner (setMapSpeculativeExecution(boolean))/(setReduceSpeculativeExecution(boolean)) , maximum number of attempts per task (setMaxMapAttempts(int)/setMaxReduceAttempts(int)) , percentage of tasks failure which can be tolerated by the job (setMaxMapTaskFailuresPercent(int)/setMaxReduceTaskFailuresPercent(int)) etc. + +Of course, users can use set(String, String)/get(String, String) to set/get arbitrary parameters needed by applications. However, use the DistributedCache for large amounts of (read-only) data. + +Task Execution & Environment +The TaskTracker executes the Mapper/ Reducer task as a child process in a separate jvm. + +The child-task inherits the environment of the parent TaskTracker. The user can specify additional options to the child-jvm via the mapred.{map|reduce}.child.java.opts configuration parameter in the JobConf such as non-standard paths for the run-time linker to search shared libraries via -Djava.library.path=<> etc. If the mapred.{map|reduce}.child.java.opts parameters contains the symbol @taskid@ it is interpolated with value of taskid of the MapReduce task. + +Here is an example with multiple arguments and substitutions, showing jvm GC logging, and start of a passwordless JVM JMX agent so that it can connect with jconsole and the likes to watch child memory, threads and get thread dumps. It also sets the maximum heap-size of the map and reduce child jvm to 512MB & 1024MB respectively. It also adds an additional path to the java.library.path of the child-jvm. + + + mapred.map.child.java.opts + + -Xmx512M -Djava.library.path=/home/mycompany/lib -verbose:gc -Xloggc:/tmp/@taskid@.gc + -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false + + + + + mapred.reduce.child.java.opts + + -Xmx1024M -Djava.library.path=/home/mycompany/lib -verbose:gc -Xloggc:/tmp/@taskid@.gc + -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false + + + +Memory Management +Users/admins can also specify the maximum virtual memory of the launched child-task, and any sub-process it launches recursively, using mapred.{map|reduce}.child.ulimit. Note that the value set here is a per process limit. The value for mapred.{map|reduce}.child.ulimit should be specified in kilo bytes (KB). And also the value must be greater than or equal to the -Xmx passed to JavaVM, else the VM might not start. + +Note: mapred.{map|reduce}.child.java.opts are used only for configuring the launched child tasks from task tracker. Configuring the memory options for daemons is documented in Configuring the Environment of the Hadoop Daemons. + +The memory available to some parts of the framework is also configurable. In map and reduce tasks, performance may be influenced by adjusting parameters influencing the concurrency of operations and the frequency with which data will hit disk. Monitoring the filesystem counters for a job- particularly relative to byte counts from the map and into the reduce- is invaluable to the tuning of these parameters. + +Users can choose to override default limits of Virtual Memory and RAM enforced by the task tracker, if memory management is enabled. Users can set the following parameter per job: + +Name Type Description +mapred.task.maxvmem int A number, in bytes, that represents the maximum Virtual Memory task-limit for each task of the job. A task will be killed if it consumes more Virtual Memory than this number. +mapred.task.maxpmem int A number, in bytes, that represents the maximum RAM task-limit for each task of the job. This number can be optionally used by Schedulers to prevent over-scheduling of tasks on a node based on RAM needs. +Map Parameters +A record emitted from a map will be serialized into a buffer and metadata will be stored into accounting buffers. As described in the following options, when either the serialization buffer or the metadata exceed a threshold, the contents of the buffers will be sorted and written to disk in the background while the map continues to output records. If either buffer fills completely while the spill is in progress, the map thread will block. When the map is finished, any remaining records are written to disk and all on-disk segments are merged into a single file. Minimizing the number of spills to disk can decrease map time, but a larger buffer also decreases the memory available to the mapper. + +Name Type Description +io.sort.mb int The cumulative size of the serialization and accounting buffers storing records emitted from the map, in megabytes. +io.sort.record.percent float The ratio of serialization to accounting space can be adjusted. Each serialized record requires 16 bytes of accounting information in addition to its serialized size to effect the sort. This percentage of space allocated from io.sort.mb affects the probability of a spill to disk being caused by either exhaustion of the serialization buffer or the accounting space. Clearly, for a map outputting small records, a higher value than the default will likely decrease the number of spills to disk. +io.sort.spill.percent float This is the threshold for the accounting and serialization buffers. When this percentage of either buffer has filled, their contents will be spilled to disk in the background. Let io.sort.record.percent be r, io.sort.mb be x, and this value be q. The maximum number of records collected before the collection thread will spill is r * x * q * 2^16. Note that a higher value may decrease the number of- or even eliminate- merges, but will also increase the probability of the map task getting blocked. The lowest average map times are usually obtained by accurately estimating the size of the map output and preventing multiple spills. +Other notes + +If either spill threshold is exceeded while a spill is in progress, collection will continue until the spill is finished. For example, if io.sort.buffer.spill.percent is set to 0.33, and the remainder of the buffer is filled while the spill runs, the next spill will include all the collected records, or 0.66 of the buffer, and will not generate additional spills. In other words, the thresholds are defining triggers, not blocking. +A record larger than the serialization buffer will first trigger a spill, then be spilled to a separate file. It is undefined whether or not this record will first pass through the combiner. +Shuffle/Reduce Parameters +As described previously, each reduce fetches the output assigned to it by the Partitioner via HTTP into memory and periodically merges these outputs to disk. If intermediate compression of map outputs is turned on, each output is decompressed into memory. The following options affect the frequency of these merges to disk prior to the reduce and the memory allocated to map output during the reduce. + +Name Type Description +io.sort.factor int Specifies the number of segments on disk to be merged at the same time. It limits the number of open files and compression codecs during the merge. If the number of files exceeds this limit, the merge will proceed in several passes. Though this limit also applies to the map, most jobs should be configured so that hitting this limit is unlikely there. +mapred.inmem.merge.threshold int The number of sorted map outputs fetched into memory before being merged to disk. Like the spill thresholds in the preceding note, this is not defining a unit of partition, but a trigger. In practice, this is usually set very high (1000) or disabled (0), since merging in-memory segments is often less expensive than merging from disk (see notes following this table). This threshold influences only the frequency of in-memory merges during the shuffle. +mapred.job.shuffle.merge.percent float The memory threshold for fetched map outputs before an in-memory merge is started, expressed as a percentage of memory allocated to storing map outputs in memory. Since map outputs that can't fit in memory can be stalled, setting this high may decrease parallelism between the fetch and merge. Conversely, values as high as 1.0 have been effective for reduces whose input can fit entirely in memory. This parameter influences only the frequency of in-memory merges during the shuffle. +mapred.job.shuffle.input.buffer.percent float The percentage of memory- relative to the maximum heapsize as typically specified in mapred.reduce.child.java.opts- that can be allocated to storing map outputs during the shuffle. Though some memory should be set aside for the framework, in general it is advantageous to set this high enough to store large and numerous map outputs. +mapred.job.reduce.input.buffer.percent float The percentage of memory relative to the maximum heapsize in which map outputs may be retained during the reduce. When the reduce begins, map outputs will be merged to disk until those that remain are under the resource limit this defines. By default, all map outputs are merged to disk before the reduce begins to maximize the memory available to the reduce. For less memory-intensive reduces, this should be increased to avoid trips to disk. +Other notes + +If a map output is larger than 25 percent of the memory allocated to copying map outputs, it will be written directly to disk without first staging through memory. +When running with a combiner, the reasoning about high merge thresholds and large buffers may not hold. For merges started before all map outputs have been fetched, the combiner is run while spilling to disk. In some cases, one can obtain better reduce times by spending resources combining map outputs- making disk spills small and parallelizing spilling and fetching- rather than aggressively increasing buffer sizes. +When merging in-memory map outputs to disk to begin the reduce, if an intermediate merge is necessary because there are segments to spill and at least io.sort.factor segments already on disk, the in-memory map outputs will be part of the intermediate merge. +Directory Structure +The task tracker has local directory, ${mapred.local.dir}/taskTracker/ to create localized cache and localized job. It can define multiple local directories (spanning multiple disks) and then each filename is assigned to a semi-random local directory. When the job starts, task tracker creates a localized job directory relative to the local directory specified in the configuration. Thus the task tracker directory structure looks as following: + +${mapred.local.dir}/taskTracker/distcache/ : The public distributed cache for the jobs of all users. This directory holds the localized public distributed cache. Thus localized public distributed cache is shared among all the tasks and jobs of all users. +${mapred.local.dir}/taskTracker/$user/distcache/ : The private distributed cache for the jobs of the specific user. This directory holds the localized private distributed cache. Thus localized private distributed cache is shared among all the tasks and jobs of the specific user only. It is not accessible to jobs of other users. +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/ : The localized job directory +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/work/ : The job-specific shared directory. The tasks can use this space as scratch space and share files among them. This directory is exposed to the users through the configuration property job.local.dir. The directory can accessed through the API JobConf.getJobLocalDir(). It is available as System property also. So, users (streaming etc.) can call System.getProperty("job.local.dir") to access the directory. +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/jars/ : The jars directory, which has the job jar file and expanded jar. The job.jar is the application's jar file that is automatically distributed to each machine. It is expanded in jars directory before the tasks for the job start. The job.jar location is accessible to the application through the api JobConf.getJar() . To access the unjarred directory, JobConf.getJar().getParent() can be called. +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/job.xml : The job.xml file, the generic job configuration, localized for the job. +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid : The task directory for each task attempt. Each task directory again has the following structure : +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/job.xml : A job.xml file, task localized job configuration, Task localization means that properties have been set that are specific to this particular task within the job. The properties localized for each task are described below. +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/output : A directory for intermediate output files. This contains the temporary map reduce data generated by the framework such as map output files etc. +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/work : The current working directory of the task. With jvm reuse enabled for tasks, this directory will be the directory on which the jvm has started +${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/work/tmp : The temporary directory for the task. (User can specify the property mapred.child.tmp to set the value of temporary directory for map and reduce tasks. This defaults to ./tmp. If the value is not an absolute path, it is prepended with task's working directory. Otherwise, it is directly assigned. The directory will be created if it doesn't exist. Then, the child java tasks are executed with option -Djava.io.tmpdir='the absolute path of the tmp dir'. Pipes and streaming are set with environment variable, TMPDIR='the absolute path of the tmp dir'). This directory is created, if mapred.child.tmp has the value ./tmp +Task JVM Reuse +Jobs can enable task JVMs to be reused by specifying the job configuration mapred.job.reuse.jvm.num.tasks. If the value is 1 (the default), then JVMs are not reused (i.e. 1 task per JVM). If it is -1, there is no limit to the number of tasks a JVM can run (of the same job). One can also specify some value greater than 1 using the api JobConf.setNumTasksToExecutePerJvm(int) + +Configured Parameters +The following properties are localized in the job configuration for each task's execution: + +Name Type Description +mapred.job.id String The job id +mapred.jar String job.jar location in job directory +job.local.dir String The job specific shared scratch space +mapred.tip.id String The task id +mapred.task.id String The task attempt id +mapred.task.is.map boolean Is this a map task +mapred.task.partition int The id of the task within the job +map.input.file String The filename that the map is reading from +map.input.start long The offset of the start of the map input split +map.input.length long The number of bytes in the map input split +mapred.work.output.dir String The task's temporary output directory +Note: During the execution of a streaming job, the names of the "mapred" parameters are transformed. The dots ( . ) become underscores ( _ ). For example, mapred.job.id becomes mapred_job_id and mapred.jar becomes mapred_jar. To get the values in a streaming job's mapper/reducer use the parameter names with the underscores. + +Task Logs +The standard output (stdout) and error (stderr) streams of the task are read by the TaskTracker and logged to ${HADOOP_LOG_DIR}/userlogs + +Distributing Libraries +The DistributedCache can also be used to distribute both jars and native libraries for use in the map and/or reduce tasks. The child-jvm always has its current working directory added to the java.library.path and LD_LIBRARY_PATH. And hence the cached libraries can be loaded via System.loadLibrary or System.load. More details on how to load shared libraries through distributed cache are documented at native_libraries.html + +Job Submission and Monitoring +JobClient is the primary interface by which user-job interacts with the JobTracker. + +JobClient provides facilities to submit jobs, track their progress, access component-tasks' reports and logs, get the MapReduce cluster's status information and so on. + +The job submission process involves: + +Checking the input and output specifications of the job. +Computing the InputSplit values for the job. +Setting up the requisite accounting information for the DistributedCache of the job, if necessary. +Copying the job's jar and configuration to the MapReduce system directory on the FileSystem. +Submitting the job to the JobTracker and optionally monitoring it's status. +Job history files are also logged to user specified directory hadoop.job.history.user.location which defaults to job output directory. The files are stored in "_logs/history/" in the specified directory. Hence, by default they will be in mapred.output.dir/_logs/history. User can stop logging by giving the value none for hadoop.job.history.user.location + +User can view the history logs summary in specified directory using the following command +$ bin/hadoop job -history output-dir +This command will print job details, failed and killed tip details. +More details about the job such as successful tasks and task attempts made for each task can be viewed using the following command +$ bin/hadoop job -history all output-dir +User can use OutputLogFilter to filter log files from the output directory listing. + +Normally the user creates the application, describes various facets of the job via JobConf, and then uses the JobClient to submit the job and monitor its progress. + +Job Authorization +Job level authorization and queue level authorization are enabled on the cluster, if the configuration mapred.acls.enabled is set to true. When enabled, access control checks are done by (a) the JobTracker before allowing users to submit jobs to queues and administering these jobs and (b) by the JobTracker and the TaskTracker before allowing users to view job details or to modify a job using MapReduce APIs, CLI or web user interfaces. + +A job submitter can specify access control lists for viewing or modifying a job via the configuration properties mapreduce.job.acl-view-job and mapreduce.job.acl-modify-job respectively. By default, nobody is given access in these properties. + +However, irrespective of the job ACLs configured, a job's owner, the superuser and cluster administrators (mapreduce.cluster.administrators) and queue administrators of the queue to which the job was submitted to (mapred.queue.queue-name.acl-administer-jobs) always have access to view and modify a job. + +A job view ACL authorizes users against the configured mapreduce.job.acl-view-job before returning possibly sensitive information about a job, like: + +job level counters +task level counters +tasks's diagnostic information +task logs displayed on the TaskTracker web UI +job.xml showed by the JobTracker's web UI +Other information about a job, like its status and its profile, is accessible to all users, without requiring authorization. + +A job modification ACL authorizes users against the configured mapreduce.job.acl-modify-job before allowing modifications to jobs, like: + +killing a job +killing/failing a task of a job +setting the priority of a job +These operations are also permitted by the queue level ACL, "mapred.queue.queue-name.acl-administer-jobs", configured via mapred-queue-acls.xml. The caller will be able to do the operation if he/she is part of either queue admins ACL or job modification ACL. + +The format of a job level ACL is the same as the format for a queue level ACL as defined in the Cluster Setup documentation. + +Job Control +Users may need to chain MapReduce jobs to accomplish complex tasks which cannot be done via a single MapReduce job. This is fairly easy since the output of the job typically goes to distributed file-system, and the output, in turn, can be used as the input for the next job. + +However, this also means that the onus on ensuring jobs are complete (success/failure) lies squarely on the clients. In such cases, the various job-control options are: + +runJob(JobConf) : Submits the job and returns only after the job has completed. +submitJob(JobConf) : Only submits the job, then poll the returned handle to the RunningJob to query status and make scheduling decisions. +JobConf.setJobEndNotificationURI(String) : Sets up a notification upon job-completion, thus avoiding polling. +Job Credentials +In a secure cluster, the user is authenticated via Kerberos' kinit command. Because of scalability concerns, we don't push the client's Kerberos' tickets in MapReduce jobs. Instead, we acquire delegation tokens from each HDFS NameNode that the job will use and store them in the job as part of job submission. The delegation tokens are automatically obtained for the HDFS that holds the staging directories, where the job job files are written, and any HDFS systems referenced by FileInputFormats, FileOutputFormats, DistCp, and the distributed cache. Other applications require to set the configuration "mapreduce.job.hdfs-servers" for all NameNodes that tasks might need to talk during the job execution. This is a comma separated list of file system names, such as "hdfs://nn1/,hdfs://nn2/". These tokens are passed to the JobTracker as part of the job submission as Credentials. + +Similar to HDFS delegation tokens, we also have MapReduce delegation tokens. The MapReduce tokens are provided so that tasks can spawn jobs if they wish to. The tasks authenticate to the JobTracker via the MapReduce delegation tokens. The delegation token can be obtained via the API in JobClient.getDelegationToken. The obtained token must then be pushed onto the credentials that is there in the JobConf used for job submission. The API Credentials.addToken can be used for this. + +The credentials are sent to the JobTracker as part of the job submission process. The JobTracker persists the tokens and secrets in its filesystem (typically HDFS) in a file within mapred.system.dir/JOBID. The TaskTracker localizes the file as part job localization. Tasks see an environment variable called HADOOP_TOKEN_FILE_LOCATION and the framework sets this to point to the localized file. In order to launch jobs from tasks or for doing any HDFS operation, tasks must set the configuration "mapreduce.job.credentials.binary" to point to this token file. + +The HDFS delegation tokens passed to the JobTracker during job submission are are cancelled by the JobTracker when the job completes. This is the default behavior unless mapreduce.job.complete.cancel.delegation.tokens is set to false in the JobConf. For jobs whose tasks in turn spawns jobs, this should be set to false. Applications sharing JobConf objects between multiple jobs on the JobClient side should look at setting mapreduce.job.complete.cancel.delegation.tokens to false. This is because the Credentials object within the JobConf will then be shared. All jobs will end up sharing the same tokens, and hence the tokens should not be canceled when the jobs in the sequence finish. + +Apart from the HDFS delegation tokens, arbitrary secrets can also be passed during the job submission for tasks to access other third party services. The APIs JobConf.getCredentials or JobContext.getCredentials() should be used to get the credentials object and then Credentials.addSecretKey should be used to add secrets. + +For applications written using the old MapReduce API, the Mapper/Reducer classes need to implement JobConfigurable in order to get access to the credentials in the tasks. A reference to the JobConf passed in the JobConfigurable.configure should be stored. In the new MapReduce API, a similar thing can be done in the Mapper.setup method. The api JobConf.getCredentials() or the api JobContext.getCredentials() should be used to get the credentials reference (depending on whether the new MapReduce API or the old MapReduce API is used). Tasks can access the secrets using the APIs in Credentials + +Job Input +InputFormat describes the input-specification for a MapReduce job. + +The MapReduce framework relies on the InputFormat of the job to: + +Validate the input-specification of the job. +Split-up the input file(s) into logical InputSplit instances, each of which is then assigned to an individual Mapper. +Provide the RecordReader implementation used to glean input records from the logical InputSplit for processing by the Mapper. +The default behavior of file-based InputFormat implementations, typically sub-classes of FileInputFormat, is to split the input into logical InputSplit instances based on the total size, in bytes, of the input files. However, the FileSystem blocksize of the input files is treated as an upper bound for input splits. A lower bound on the split size can be set via mapred.min.split.size. + +Clearly, logical splits based on input-size is insufficient for many applications since record boundaries must be respected. In such cases, the application should implement a RecordReader, who is responsible for respecting record-boundaries and presents a record-oriented view of the logical InputSplit to the individual task. + +TextInputFormat is the default InputFormat. + +If TextInputFormat is the InputFormat for a given job, the framework detects input-files with the .gz extensions and automatically decompresses them using the appropriate CompressionCodec. However, it must be noted that compressed files with the above extensions cannot be split and each compressed file is processed in its entirety by a single mapper. + +InputSplit +InputSplit represents the data to be processed by an individual Mapper. + +Typically InputSplit presents a byte-oriented view of the input, and it is the responsibility of RecordReader to process and present a record-oriented view. + +FileSplit is the default InputSplit. It sets map.input.file to the path of the input file for the logical split. + +RecordReader +RecordReader reads pairs from an InputSplit. + +Typically the RecordReader converts the byte-oriented view of the input, provided by the InputSplit, and presents a record-oriented to the Mapper implementations for processing. RecordReader thus assumes the responsibility of processing record boundaries and presents the tasks with keys and values. + +Job Output +OutputFormat describes the output-specification for a MapReduce job. + +The MapReduce framework relies on the OutputFormat of the job to: + +Validate the output-specification of the job; for example, check that the output directory doesn't already exist. +Provide the RecordWriter implementation used to write the output files of the job. Output files are stored in a FileSystem. +TextOutputFormat is the default OutputFormat. + +OutputCommitter +OutputCommitter describes the commit of task output for a MapReduce job. + +The MapReduce framework relies on the OutputCommitter of the job to: + +Setup the job during initialization. For example, create the temporary output directory for the job during the initialization of the job. Job setup is done by a separate task when the job is in PREP state and after initializing tasks. Once the setup task completes, the job will be moved to RUNNING state. +Cleanup the job after the job completion. For example, remove the temporary output directory after the job completion. Job cleanup is done by a separate task at the end of the job. Job is declared SUCCEDED/FAILED/KILLED after the cleanup task completes. +Setup the task temporary output. Task setup is done as part of the same task, during task initialization. +Check whether a task needs a commit. This is to avoid the commit procedure if a task does not need commit. +Commit of the task output. Once task is done, the task will commit it's output if required. +Discard the task commit. If the task has been failed/killed, the output will be cleaned-up. If task could not cleanup (in exception block), a separate task will be launched with same attempt-id to do the cleanup. +FileOutputCommitter is the default OutputCommitter. Job setup/cleanup tasks occupy map or reduce slots, whichever is free on the TaskTracker. And JobCleanup task, TaskCleanup tasks and JobSetup task have the highest priority, and in that order. + +Task Side-Effect Files +In some applications, component tasks need to create and/or write to side-files, which differ from the actual job-output files. + +In such cases there could be issues with two instances of the same Mapper or Reducer running simultaneously (for example, speculative tasks) trying to open and/or write to the same file (path) on the FileSystem. Hence the application-writer will have to pick unique names per task-attempt (using the attemptid, say attempt_200709221812_0001_m_000000_0), not just per task. + +To avoid these issues the MapReduce framework, when the OutputCommitter is FileOutputCommitter, maintains a special ${mapred.output.dir}/_temporary/_${taskid} sub-directory accessible via ${mapred.work.output.dir} for each task-attempt on the FileSystem where the output of the task-attempt is stored. On successful completion of the task-attempt, the files in the ${mapred.output.dir}/_temporary/_${taskid} (only) are promoted to ${mapred.output.dir}. Of course, the framework discards the sub-directory of unsuccessful task-attempts. This process is completely transparent to the application. + +The application-writer can take advantage of this feature by creating any side-files required in ${mapred.work.output.dir} during execution of a task via FileOutputFormat.getWorkOutputPath(), and the framework will promote them similarly for succesful task-attempts, thus eliminating the need to pick unique paths per task-attempt. + +Note: The value of ${mapred.work.output.dir} during execution of a particular task-attempt is actually ${mapred.output.dir}/_temporary/_{$taskid}, and this value is set by the MapReduce framework. So, just create any side-files in the path returned by FileOutputFormat.getWorkOutputPath() from MapReduce task to take advantage of this feature. + +The entire discussion holds true for maps of jobs with reducer=NONE (i.e. 0 reduces) since output of the map, in that case, goes directly to HDFS. + +RecordWriter +RecordWriter writes the output pairs to an output file. + +RecordWriter implementations write the job outputs to the FileSystem. + +Other Useful Features +Submitting Jobs to Queues +Users submit jobs to Queues. Queues, as collection of jobs, allow the system to provide specific functionality. For example, queues use ACLs to control which users who can submit jobs to them. Queues are expected to be primarily used by Hadoop Schedulers. + +Hadoop comes configured with a single mandatory queue, called 'default'. Queue names are defined in the mapred.queue.names property of the Hadoop site configuration. Some job schedulers, such as the Capacity Scheduler, support multiple queues. + +A job defines the queue it needs to be submitted to through the mapred.job.queue.name property, or through the setQueueName(String) API. Setting the queue name is optional. If a job is submitted without an associated queue name, it is submitted to the 'default' queue. + +Counters +Counters represent global counters, defined either by the MapReduce framework or applications. Each Counter can be of any Enum type. Counters of a particular Enum are bunched into groups of type Counters.Group. + +Applications can define arbitrary Counters (of type Enum) and update them via Reporter.incrCounter(Enum, long) or Reporter.incrCounter(String, String, long) in the map and/or reduce methods. These counters are then globally aggregated by the framework. + +DistributedCache +DistributedCache distributes application-specific, large, read-only files efficiently. + +DistributedCache is a facility provided by the MapReduce framework to cache files (text, archives, jars and so on) needed by applications. + +Applications specify the files to be cached via urls (hdfs://) in the JobConf. The DistributedCache assumes that the files specified via hdfs:// urls are already present on the FileSystem. + +The framework will copy the necessary files to the slave node before any tasks for the job are executed on that node. Its efficiency stems from the fact that the files are only copied once per job and the ability to cache archives which are un-archived on the slaves. + +DistributedCache tracks the modification timestamps of the cached files. Clearly the cache files should not be modified by the application or externally while the job is executing. + +DistributedCache can be used to distribute simple, read-only data/text files and more complex types such as archives and jars. Archives (zip, tar, tgz and tar.gz files) are un-archived at the slave nodes. Files have execution permissions set. + +The files/archives can be distributed by setting the property mapred.cache.{files|archives}. If more than one file/archive has to be distributed, they can be added as comma separated paths. The properties can also be set by APIs DistributedCache.addCacheFile(URI,conf)/ DistributedCache.addCacheArchive(URI,conf) and DistributedCache.setCacheFiles(URIs,conf)/ DistributedCache.setCacheArchives(URIs,conf) where URI is of the form hdfs://host:port/absolute-path#link-name. In Streaming, the files can be distributed through command line option -cacheFile/-cacheArchive. + +Optionally users can also direct the DistributedCache to symlink the cached file(s) into the current working directory of the task via the DistributedCache.createSymlink(Configuration) api. Or by setting the configuration property mapred.create.symlink as yes. The DistributedCache will use the fragment of the URI as the name of the symlink. For example, the URI hdfs://namenode:port/lib.so.1#lib.so will have the symlink name as lib.so in task's cwd for the file lib.so.1 in distributed cache. + +The DistributedCache can also be used as a rudimentary software distribution mechanism for use in the map and/or reduce tasks. It can be used to distribute both jars and native libraries. The DistributedCache.addArchiveToClassPath(Path, Configuration) or DistributedCache.addFileToClassPath(Path, Configuration) api can be used to cache files/jars and also add them to the classpath of child-jvm. The same can be done by setting the configuration properties mapred.job.classpath.{files|archives}. Similarly the cached files that are symlinked into the working directory of the task can be used to distribute native libraries and load them. + +Private and Public DistributedCache Files +DistributedCache files can be private or public, that determines how they can be shared on the slave nodes. + +"Private" DistributedCache files are cached in a local directory private to the user whose jobs need these files. These files are shared by all tasks and jobs of the specific user only and cannot be accessed by jobs of other users on the slaves. A DistributedCache file becomes private by virtue of its permissions on the file system where the files are uploaded, typically HDFS. If the file has no world readable access, or if the directory path leading to the file has no world executable access for lookup, then the file becomes private. +"Public" DistributedCache files are cached in a global directory and the file access is setup such that they are publicly visible to all users. These files can be shared by tasks and jobs of all users on the slaves. A DistributedCache file becomes public by virtue of its permissions on the file system where the files are uploaded, typically HDFS. If the file has world readable access, AND if the directory path leading to the file has world executable access for lookup, then the file becomes public. In other words, if the user intends to make a file publicly available to all users, the file permissions must be set to be world readable, and the directory permissions on the path leading to the file must be world executable. +Tool +The Tool interface supports the handling of generic Hadoop command-line options. + +Tool is the standard for any MapReduce tool or application. The application should delegate the handling of standard command-line options to GenericOptionsParser via ToolRunner.run(Tool, String[]) and only handle its custom arguments. + +The generic Hadoop command-line options are: +-conf +-D +-fs +-jt + +IsolationRunner +IsolationRunner is a utility to help debug MapReduce programs. + +To use the IsolationRunner, first set keep.failed.task.files to true (also see keep.task.files.pattern). + +Next, go to the node on which the failed task ran and go to the TaskTracker's local directory and run the IsolationRunner: +$ cd /taskTracker/${taskid}/work +$ bin/hadoop org.apache.hadoop.mapred.IsolationRunner ../job.xml + +IsolationRunner will run the failed task in a single jvm, which can be in the debugger, over precisely the same input. + +Note that currently IsolationRunner will only re-run map tasks. + +Profiling +Profiling is a utility to get a representative (2 or 3) sample of built-in java profiler for a sample of maps and reduces. + +User can specify whether the system should collect profiler information for some of the tasks in the job by setting the configuration property mapred.task.profile. The value can be set using the api JobConf.setProfileEnabled(boolean). If the value is set true, the task profiling is enabled. The profiler information is stored in the user log directory. By default, profiling is not enabled for the job. + +Once user configures that profiling is needed, she/he can use the configuration property mapred.task.profile.{maps|reduces} to set the ranges of MapReduce tasks to profile. The value can be set using the api JobConf.setProfileTaskRange(boolean,String). By default, the specified range is 0-2. + +User can also specify the profiler configuration arguments by setting the configuration property mapred.task.profile.params. The value can be specified using the api JobConf.setProfileParams(String). If the string contains a %s, it will be replaced with the name of the profiling output file when the task runs. These parameters are passed to the task child JVM on the command line. The default value for the profiling parameters is -agentlib:hprof=cpu=samples,heap=sites,force=n,thread=y,verbose=n,file=%s + +Debugging +The MapReduce framework provides a facility to run user-provided scripts for debugging. When a MapReduce task fails, a user can run a debug script, to process task logs for example. The script is given access to the task's stdout and stderr outputs, syslog and jobconf. The output from the debug script's stdout and stderr is displayed on the console diagnostics and also as part of the job UI. + +In the following sections we discuss how to submit a debug script with a job. The script file needs to be distributed and submitted to the framework. + +How to distribute the script file: +The user needs to use DistributedCache to distribute and symlink the script file. + +How to submit the script: +A quick way to submit the debug script is to set values for the properties mapred.map.task.debug.script and mapred.reduce.task.debug.script, for debugging map and reduce tasks respectively. These properties can also be set by using APIs JobConf.setMapDebugScript(String) and JobConf.setReduceDebugScript(String) . In streaming mode, a debug script can be submitted with the command-line options -mapdebug and -reducedebug, for debugging map and reduce tasks respectively. + +The arguments to the script are the task's stdout, stderr, syslog and jobconf files. The debug command, run on the node where the MapReduce task failed, is: +$script $stdout $stderr $syslog $jobconf + +Pipes programs have the c++ program name as a fifth argument for the command. Thus for the pipes programs the command is +$script $stdout $stderr $syslog $jobconf $program + +Default Behavior: +For pipes, a default script is run to process core dumps under gdb, prints stack trace and gives info about running threads. + +JobControl +JobControl is a utility which encapsulates a set of MapReduce jobs and their dependencies. + +Data Compression +Hadoop MapReduce provides facilities for the application-writer to specify compression for both intermediate map-outputs and the job-outputs i.e. output of the reduces. It also comes bundled with CompressionCodec implementation for the zlib compression algorithm. The gzip file format is also supported. + +Hadoop also provides native implementations of the above compression codecs for reasons of both performance (zlib) and non-availability of Java libraries. More details on their usage and availability are available here. + +Intermediate Outputs +Applications can control compression of intermediate map-outputs via the JobConf.setCompressMapOutput(boolean) api and the CompressionCodec to be used via the JobConf.setMapOutputCompressorClass(Class) api. + +Job Outputs +Applications can control compression of job-outputs via the FileOutputFormat.setCompressOutput(JobConf, boolean) api and the CompressionCodec to be used can be specified via the FileOutputFormat.setOutputCompressorClass(JobConf, Class) api. + +If the job outputs are to be stored in the SequenceFileOutputFormat, the required SequenceFile.CompressionType (i.e. RECORD / BLOCK - defaults to RECORD) can be specified via the SequenceFileOutputFormat.setOutputCompressionType(JobConf, SequenceFile.CompressionType) api. + +Skipping Bad Records +Hadoop provides an option where a certain set of bad input records can be skipped when processing map inputs. Applications can control this feature through the SkipBadRecords class. + +This feature can be used when map tasks crash deterministically on certain input. This usually happens due to bugs in the map function. Usually, the user would have to fix these bugs. This is, however, not possible sometimes. The bug may be in third party libraries, for example, for which the source code is not available. In such cases, the task never completes successfully even after multiple attempts, and the job fails. With this feature, only a small portion of data surrounding the bad records is lost, which may be acceptable for some applications (those performing statistical analysis on very large data, for example). + +By default this feature is disabled. For enabling it, refer to SkipBadRecords.setMapperMaxSkipRecords(Configuration, long) and SkipBadRecords.setReducerMaxSkipGroups(Configuration, long). + +With this feature enabled, the framework gets into 'skipping mode' after a certain number of map failures. For more details, see SkipBadRecords.setAttemptsToStartSkipping(Configuration, int). In 'skipping mode', map tasks maintain the range of records being processed. To do this, the framework relies on the processed record counter. See SkipBadRecords.COUNTER_MAP_PROCESSED_RECORDS and SkipBadRecords.COUNTER_REDUCE_PROCESSED_GROUPS. This counter enables the framework to know how many records have been processed successfully, and hence, what record range caused a task to crash. On further attempts, this range of records is skipped. + +The number of records skipped depends on how frequently the processed record counter is incremented by the application. It is recommended that this counter be incremented after every record is processed. This may not be possible in some applications that typically batch their processing. In such cases, the framework may skip additional records surrounding the bad record. Users can control the number of skipped records through SkipBadRecords.setMapperMaxSkipRecords(Configuration, long) and SkipBadRecords.setReducerMaxSkipGroups(Configuration, long). The framework tries to narrow the range of skipped records using a binary search-like approach. The skipped range is divided into two halves and only one half gets executed. On subsequent failures, the framework figures out which half contains bad records. A task will be re-executed till the acceptable skipped value is met or all task attempts are exhausted. To increase the number of task attempts, use JobConf.setMaxMapAttempts(int) and JobConf.setMaxReduceAttempts(int). + +Skipped records are written to HDFS in the sequence file format, for later analysis. The location can be changed through SkipBadRecords.setSkipOutputPath(JobConf, Path). + +Example: WordCount v2.0 +Here is a more complete WordCount which uses many of the features provided by the MapReduce framework we discussed so far. + +This needs the HDFS to be up and running, especially for the DistributedCache-related features. Hence it only works with a pseudo-distributed or fully-distributed Hadoop installation. + +Source Code +WordCount.java +1. package org.myorg; +2. +3. import java.io.*; +4. import java.util.*; +5. +6. import org.apache.hadoop.fs.Path; +7. import org.apache.hadoop.filecache.DistributedCache; +8. import org.apache.hadoop.conf.*; +9. import org.apache.hadoop.io.*; +10. import org.apache.hadoop.mapred.*; +11. import org.apache.hadoop.util.*; +12. +13. public class WordCount extends Configured implements Tool { +14. +15. public static class Map extends MapReduceBase implements Mapper { +16. +17. static enum Counters { INPUT_WORDS } +18. +19. private final static IntWritable one = new IntWritable(1); +20. private Text word = new Text(); +21. +22. private boolean caseSensitive = true; +23. private Set patternsToSkip = new HashSet(); +24. +25. private long numRecords = 0; +26. private String inputFile; +27. +28. public void configure(JobConf job) { +29. caseSensitive = job.getBoolean("wordcount.case.sensitive", true); +30. inputFile = job.get("map.input.file"); +31. +32. if (job.getBoolean("wordcount.skip.patterns", false)) { +33. Path[] patternsFiles = new Path[0]; +34. try { +35. patternsFiles = DistributedCache.getLocalCacheFiles(job); +36. } catch (IOException ioe) { +37. System.err.println("Caught exception while getting cached files: " + StringUtils.stringifyException(ioe)); +38. } +39. for (Path patternsFile : patternsFiles) { +40. parseSkipFile(patternsFile); +41. } +42. } +43. } +44. +45. private void parseSkipFile(Path patternsFile) { +46. try { +47. BufferedReader fis = new BufferedReader(new FileReader(patternsFile.toString())); +48. String pattern = null; +49. while ((pattern = fis.readLine()) != null) { +50. patternsToSkip.add(pattern); +51. } +52. } catch (IOException ioe) { +53. System.err.println("Caught exception while parsing the cached file '" + patternsFile + "' : " + StringUtils.stringifyException(ioe)); +54. } +55. } +56. +57. public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException { +58. String line = (caseSensitive) ? value.toString() : value.toString().toLowerCase(); +59. +60. for (String pattern : patternsToSkip) { +61. line = line.replaceAll(pattern, ""); +62. } +63. +64. StringTokenizer tokenizer = new StringTokenizer(line); +65. while (tokenizer.hasMoreTokens()) { +66. word.set(tokenizer.nextToken()); +67. output.collect(word, one); +68. reporter.incrCounter(Counters.INPUT_WORDS, 1); +69. } +70. +71. if ((++numRecords % 100) == 0) { +72. reporter.setStatus("Finished processing " + numRecords + " records " + "from the input file: " + inputFile); +73. } +74. } +75. } +76. +77. public static class Reduce extends MapReduceBase implements Reducer { +78. public void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException { +79. int sum = 0; +80. while (values.hasNext()) { +81. sum += values.next().get(); +82. } +83. output.collect(key, new IntWritable(sum)); +84. } +85. } +86. +87. public int run(String[] args) throws Exception { +88. JobConf conf = new JobConf(getConf(), WordCount.class); +89. conf.setJobName("wordcount"); +90. +91. conf.setOutputKeyClass(Text.class); +92. conf.setOutputValueClass(IntWritable.class); +93. +94. conf.setMapperClass(Map.class); +95. conf.setCombinerClass(Reduce.class); +96. conf.setReducerClass(Reduce.class); +97. +98. conf.setInputFormat(TextInputFormat.class); +99. conf.setOutputFormat(TextOutputFormat.class); +100. +101. List other_args = new ArrayList(); +102. for (int i=0; i < args.length; ++i) { +103. if ("-skip".equals(args[i])) { +104. DistributedCache.addCacheFile(new Path(args[++i]).toUri(), conf); +105. conf.setBoolean("wordcount.skip.patterns", true); +106. } else { +107. other_args.add(args[i]); +108. } +109. } +110. +111. FileInputFormat.setInputPaths(conf, new Path(other_args.get(0))); +112. FileOutputFormat.setOutputPath(conf, new Path(other_args.get(1))); +113. +114. JobClient.runJob(conf); +115. return 0; +116. } +117. +118. public static void main(String[] args) throws Exception { +119. int res = ToolRunner.run(new Configuration(), new WordCount(), args); +120. System.exit(res); +121. } +122. } +123. +Sample Runs +Sample text-files as input: + +$ bin/hadoop dfs -ls /usr/joe/wordcount/input/ +/usr/joe/wordcount/input/file01 +/usr/joe/wordcount/input/file02 + +$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file01 +Hello World, Bye World! + +$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file02 +Hello Hadoop, Goodbye to hadoop. + +Run the application: + +$ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output + +Output: + +$ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000 +Bye 1 +Goodbye 1 +Hadoop, 1 +Hello 2 +World! 1 +World, 1 +hadoop. 1 +to 1 +Notice that the inputs differ from the first version we looked at, and how they affect the outputs. + +Now, lets plug-in a pattern-file which lists the word-patterns to be ignored, via the DistributedCache. + +$ hadoop dfs -cat /user/joe/wordcount/patterns.txt +\. +\, +\! +to +Run it again, this time with more options: + +$ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount -Dwordcount.case.sensitive=true /usr/joe/wordcount/input /usr/joe/wordcount/output -skip /user/joe/wordcount/patterns.txt + +As expected, the output: + +$ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000 +Bye 1 +Goodbye 1 +Hadoop 1 +Hello 2 +World 2 +hadoop 1 +Run it once more, this time switch-off case-sensitivity: + +$ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount -Dwordcount.case.sensitive=false /usr/joe/wordcount/input /usr/joe/wordcount/output -skip /user/joe/wordcount/patterns.txt + +Sure enough, the output: + +$ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000 +bye 1 +goodbye 1 +hadoop 2 +hello 2 +world 2 +Highlights +The second version of WordCount improves upon the previous one by using some features offered by the MapReduce framework: + +Demonstrates how applications can access configuration parameters in the configure method of the Mapper (and Reducer) implementations (lines 28-43). +Demonstrates how the DistributedCache can be used to distribute read-only data needed by the jobs. Here it allows the user to specify word-patterns to skip while counting (line 104). +Demonstrates the utility of the Tool interface and the GenericOptionsParser to handle generic Hadoop command-line options (lines 87-116, 119). +Demonstrates how applications can use Counters (line 68) and how they can set application-specific status information via the Reporter instance passed to the map (and reduce) method (line 72). +Java and JNI are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Tutorial.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..9bf78621edcfd8628be103b9c09e30720e6bbebd GIT binary patch literal 145408 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 ThhG5v-}f}j|MTeo?+pBZ2o>wi literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components-relation.txt new file mode 100644 index 0000000..0a30a22 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components-relation.txt @@ -0,0 +1,97 @@ +MapReduce&developer&依赖 +huge amount&unstructured datum&AGGREGATION +MapReduce&unstructured datum&依赖 +MapReduce&NCache cluster&依赖 +MapReduce¶llel&依赖 +MapReduce&huge amount&依赖 +MapReduce&developer&依赖 +MapReduce¶llel&依赖 +NCache cluster&cluster&GENERALIZATION +MapReduce&unstructured datum&依赖 +MapReduce&NCache cluster&依赖 +MapReduce&huge amount&依赖 +MapReduce&size&依赖 +cluster&size&AGGREGATION +MapReduce&node&依赖 +MapReduce&cluster&依赖 +MapReduce¶llel&依赖 +term “ MapReduce ”&two distinct phase&依赖 +‘ Map ’ phase&set&依赖 +set&datum&AGGREGATION +‘ Map ’ phase&datum&依赖 +‘ Reduce ’ phase&output&依赖 +‘ Reduce ’ phase&‘ Map ’&依赖 +‘ Reduce ’ phase&‘ Map ’&依赖 +‘ Reduce ’ phase&output&依赖 +user&key-value pair&依赖 +user&set&依赖 +user&intermediate key-value pair&依赖 +set&intermediate key-value pair&AGGREGATION +user&key-value pair&依赖 +user&intermediate key-value pair&依赖 +user&set&依赖 +Reducer&intermediate key-value pair&依赖 +Reducer&having&依赖 +Reducer&having&依赖 +Reducer&intermediate key-value pair&依赖 +example&combiner )&依赖 +cluster&three node&AGGREGATION +example&a mapreduce task (&依赖 +task&order&依赖 +task&product&依赖 +task&Mapper and extracts count&依赖 +task&order&依赖 +Mapper and extracts count&product&AGGREGATION +Reducer&node& +aggregated count&final aggregation&依赖 +count&figure 2&依赖 +aggregated count&Reducer node&依赖 +Mapper&output& +Reducer node&node&GENERALIZATION +two (&Combining&依赖 +two (&Combining&依赖 +aggregation and compilation&final result&AGGREGATION +care&aggregation and compilation&AGGREGATION +Combine phase&performance&依赖 +it&network traffic&依赖 +it&Mapper and Reducers&依赖 +NCache MapReduce&MapReduce&GENERALIZATION +NCache MapReduce&three phase&依赖 +NCache MapReduce&Map&依赖 +its&reducer& +NCache MapReduce&default reducer&依赖 +user&Reducer&实现 +Default reducer&output&依赖 +Default reducer&output&依赖 +mapper , combiner and reducer&NCache MapReduce task&依赖 +mapper , combiner and reducer&NCache cluster&依赖 +Mapper output&Combiner&依赖 +Mapper output&output&GENERALIZATION +it&Reducer&依赖 +Combiner&output& +Reducer&output&依赖 +’s output&specified chunk size&依赖 +Mapper&chunk& +Number&task&AGGREGATION +combiner or reducer once output chunk&configured chunk size&依赖 +typical MapReduce task&components :&依赖 +Mapper&initial input&依赖 +Combiner Factory&combiner&依赖 +Combiner Factory&combiner&依赖 +Combiner Factory&combiner&依赖 +its&keys& +Key Filter&filter cache datum&依赖 +Key Filter&user&依赖 +KeyFilter&Mapper phase&依赖 +Map&key&依赖 +it&false&依赖 +Mapper&key&依赖 +its&status& +component&track&依赖 +component&progress&依赖 +component&task&依赖 +progress&task&AGGREGATION +track&progress&AGGREGATION +output&task&AGGREGATION +you&output&依赖 +you&task&依赖 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt new file mode 100644 index 0000000..8781313 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt @@ -0,0 +1,48 @@ +MapReduce in NCache allows developers to process huge amounts of unstructured data in parallel across an NCache cluster. To distribute input data and analyze it in parallel, MapReduce operates in parallel on all nodes in a cluster of any size. + +MapReduce is a programming model for processing and generating large data sets with a parallel, distributed algorithm on a cluster. The term “MapReduce” refers to two distinct phases. The first phase is ‘Map’ phase, which takes a set of data and converts it into another set of data, where individual items are broken down into key-value pairs. The second phase is ‘Reduce’ phase, which takes output from ‘Map’ as an input and reduces that data set into a smaller and more meaningful data set. + +A user defined Mapper processes a key-value pair to generate a set of intermediate key-value pairs. Reducer processes all those intermediate key-value pairs (having same intermediate key) to aggregate, perform calculations or any other operation on the pairs. Another optional component, Combiner, performs merging of the intermediate key-value pairs generated by Mapper before these key-value pairs can be sent over to the Reducer. + +The following example illustrates a MapReduce task (with and without combiner) being executed over a cluster of three nodes. The task takes orders as an input to the Mapper and extracts count of products consumed in it. In figure 1, Mapper’s output is directly sent to the reducer and is being aggregated on Reducer’s node whereas in figure 2, count over a single node is aggregated first and this aggregated count is sent to the Reducer node for final aggregation. + +MapReduce without Combiner: + +MapReduce in Ncache without Combiner + +MapReduce with Combiner: + +MapReduce in Ncache with Combiner + +How does MapReduce Work? +Generally, MapReduce consists of two (sometimes three) phases: i.e. Mapping, Combining (optional) and Reducing. + +Mapping phase: Filters and prepares the input for the next phase that may be Combining or Reducing. +Reduction phase: Takes care of the aggregation and compilation of the final result. +Combining phase: Responsible for reduction local to the node, before sending the input to the Reducers. Combine phase optimizes performance as it minimizes the network traffic between Mapper and Reducers by sending the output to the Reducer in chunks. +Similarly, NCache MapReduce has three phases: Map, Combine, and Reduce. Only the Mapper is necessary to implement, Reducer and Combiner implementations are optional. NCache MapReduce will execute its default reducer if the user does not implement Reducer. Default reducer merges output omitted by Mapper into an array. + +The Mapper, Combiner and Reducer are executed simultaneously during an NCache MapReduce task on the NCache cluster. Mapper output is individually sent to the Combiner. When Combiner’s output reaches the specified chunk size, it is then sent to the Reducer, which finalizes and persists the output. + +In order to monitor the submitted task, a traceable object is provided to the user. + +Number of tasks to be executed simultaneously and Mapper’s output chunk is configurable. Mapper’s output is sent to combiner or reducer once output chunk reaches the configured chunk size. See NCache Administrator’s Guide. + +A typical MapReduce task has the following components: + +Mapper: Processes the initial input and enables user to emit the output into a dictionary to be used as an input for the combiner or reducer. + +Combiner Factory: creates and manages combiners for each key emitted into output by the mapper. + +Combiner: Works as local reducer to the node where Mapper’s output is combined to minimize traffic between Mapper and Reducer. + +Reducer Factory: create and manages reducers for each key emitted into output by the mapper or combiner. + +Reducer: Processes all those intermediate key-value pairs generated by Mapper or combined by Combiner to aggregate, perform calculations or apply different operations to produce the reduced output. + +Key Filter: Key Filter, as the name indicates, allows the user to filter cache data based on its keys before sent to the Mapper. The KeyFilter is called during Mapper phase. If it returns true, the Map will be executed on the key. If it returns false, Mapper will skip the key and move to next one from the Cache. + +TrackerTask: This component lets you keep track of the progress of the task and its status as the task is executed. And lets you fetch the output of the task and enumerate it. + +Output: The output is stored in-memory, on the server side. It can be enumerated using the TrackableTask instance on the client application. + diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce Working and Components.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..f6609e6302a873309ff95de23a68c65af5124b9f GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components-relation.txt" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components-relation.txt" new file mode 100644 index 0000000..dffaa92 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components-relation.txt" @@ -0,0 +1,22 @@ +Split&logical representation&依赖 +logical representation&block&AGGREGATION +Split&block&依赖 +map-reduce 1 mapper&1 split&依赖 +map-reduce 1 mapper&map-reduce 1 mapper&依赖 +map-reduce 1 mapper&time&依赖 +10 mapper&input file&依赖 +block size&10 split&依赖 +We&client , master and slave&依赖 +Client&job&依赖 +We&job&依赖 +we&mapper and reducer&依赖 +we&program&依赖 +We&program&依赖 +We&job&依赖 +We&sub-division&依赖 +sub-division&job&AGGREGATION +job&smaller task&依赖 +Master&multiple task&依赖 +Master&work or job&依赖 +actual work&slave&依赖 +Master&job&依赖 diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt" new file mode 100644 index 0000000..084bf15 --- /dev/null +++ "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt" @@ -0,0 +1,24 @@ +MapReduce – Components: +Split + +Split can be called as a logical representation of block. In map-reduce 1 mapper can process 1 split at a time. + +We have seen in HDFS that the default size can be 64mb or 128mb, then if file size is 1280mb, block size is 128mb than we will have 10 splits, then 10 mappers will run for the input file. + +Job + +We have seen in the HDFS that we have a client, master and slaves. Client configures the job and submits it to the master. We can say job as a program in which we execute mapper and reducer. + +Task + +We can say Task as a sub-division of job. Here job is divided into smaller tasks. Master divides the work or job into multiple tasks and gives them to slaves. The actual work is done by the slaves. + +Here we can also say that Client need to submit the job to Resource Manger which is running on Master, then Master converts that job and submits tasks to the slaves. These all tasks are run parallel and independent on each other. + +Resource Manager + +It is a daemon which runs on Master node. + +Node Manager + +It is a daemon which runs on Slaves. \ No newline at end of file diff --git "a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt.xml.xls" "b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce \342\200\223 Components.txt.xml.xls" new file mode 100644 index 0000000000000000000000000000000000000000..3cc9106b1e3ba326be2ace1739b783522c4ab8f1 GIT binary patch literal 6656 zcmeHL-ESOM6+g4ywPPH6{E?(I(DY(A)OMU=J82sl(!@>D5Tv%q4k{8w&U!s|rdjVS zGqVoi1ykS+BqScn13dJR7ieDq0Yc3i50yY5gv3+Ie}Gh^NVJ&W@7(#^wZjWSBJ{3i z?wpVNJLjHr?!7bn``?Y-edDd8?@CuYD}D0M-9hOu@SVc5j0)ttyJV$3cOAT z`%hK+YpW^aa>E&MUU}v>Q)i$d;>Z^(7gX=NdY{z$2=0#jT*v%HISX=FehdBGuYWJu z#%i(@`t|02P;jhz6zl7-$mC;_Q*%>O^Q$vwr_<+|W7S6y{i7x6mzKTtFBeq|7Usut zl_%y)7$5<291GWU>y(kK;*&Bf^CGJ>Fl$ne5^`GUnX?Hwd2$lou1;TAg@rkpk;gf( zIBM49LuO4$|D4PT(or;IJulg!Qw4M9&*uhD%L(~Z!C*Q%wV4c6v-!BYatIj}`TH)y zk+ruC`Ao9%-%ADe=d<4S(%+9y)V=f{WWK|)%UT-G6E+U_QbEd}*@r*34}W$a{$LOP z`<1GU?)2@lAKU5Ietf5@{lw0I_Oc_|AKIzyUe|r#+t^*+AuOz9bCCCCqc4W;lIqK{_m$PFmqtWZf=<}*RxbvvhS!e4xK5fD=(R&H0;-P2xxKWq^3uhtOV_Tx^de4ms5DJI!oam=(6~wYl`G4auc&-7kwd}k zjc0-l8a{=IY}MN*LvOv)@XUe%(e^^%FPMl9;i(-44KIrDqLn;BO=ae43v-D5EpHE5 zJtqEXoHq;e2`b({{8qaYn+?C|AwwqYw9G~jg0FKhk^eRFF+lMj!sFtZtu+(hsJF~5 z&)o7c=Nt8HjoDMcf7yE&Gi~~al9_{*DE2~AZ>^iC39Uy&BF}3XzXb%(eD>1wD};&( zm7+Y2gYu#R;LYjPU=6-Bg4Tw=*+K9*gEQbq_1k#7#cA63s0|x4#>)Gu*XYEajn!sY z-+PyB9PnD9x=7&i!`NQ{~B2IWo6`@TLhu>j7f7>2G_HVgRuqgn5f^ zy*veJy%Bd%s#Jo{8g%sQfmyq)_D>_52z zZQ(sYzNy;Z()$}SDGsb~$8o@!bLKD~w!7!k-jOdr0@Mn27BuTAtsJP}J&rwWXmecU z5u(<`LpXYP2u%-<9(RvL_Xc50CZGt%rK;;W1X- zdhQ-PMzC9NY!4pFqDK$=VGoa4?#5%*yLs5WOS})XN(J@CW+?|0b7`rH)?!Nafnxrw ztO|;mvs4Wfb7rZ2P|TL420$@Sq==1*$tc=mZmf*aRVInJ{FdwcQ zOJswJ@@PhJMkb?(@`;QpqOhJ^?0MD#E6|mxj3UZo8AX)i8C67K<+<|7L^f3NWk_d~ zq6}$V9?vw3D6Hlj<)ETWCz{;*U3~CZKMyL(Y(^DPSlcNcni!!Vza~V}c z;Y!F+MoKf{cWaI^q9`X5l#x=^ab39bL?Ywf;Yyk#o@04*xp%nyy3$N@@5pPHD=0@9 zEuoAm%6u|zR8bZ(s))i>lB0|%N;;0Gsr7}s!kD74!pGE)bXVYNb!9O@A6JAlulz5- zl~b9FvpJnnML)R8U3oH*O(@D!8AX(*Gm0qqWYw5Vlw!hFo}=(f(v=kDkoxlJWZWU0 z%`+KQ^o8euD`ykgVMX~&M$wmZ8AV^7&8Q*@_X=0|dcc?+Dfx0Fi>#FqtLL+}IS6J=-I&!2KJI#|ax3`GfU`*#kD4e*x1s3LO9d literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce-relation.txt new file mode 100644 index 0000000..6b4a842 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce-relation.txt @@ -0,0 +1,118 @@ +core component&Apache Hadoop software framework&AGGREGATION +MapReduce Stephen J. Bigelow&Apache Hadoop software framework&依赖 +MapReduce Stephen J. Bigelow&Apache Hadoop software framework&依赖 +MapReduce Stephen J. Bigelow&Apache Hadoop software framework&依赖 +distributed processing&commodity computer cluster&依赖 +distributed processing&commodity computer cluster&依赖 +node&cluster&AGGREGATION +node&own storage&依赖 +its&storage& +distributed processing&massive unstructured datum set&AGGREGATION +distributed processing&commodity computer cluster&依赖 +it&result&依赖 +MapReduce&two essential function&依赖 +it&result&依赖 +it&node&依赖 +it&node&依赖 +it&node&依赖 +it&node&依赖 +it&result&依赖 +it&result&依赖 +MapReduce&original version&依赖 +original version&MapReduce&AGGREGATION +MapReduce&MapReduce&依赖 +master node&jobs and resource&依赖 +master node&cluster&依赖 +master node&node&GENERALIZATION +component&completed job&依赖 +previous JobTracker and TaskTracker daemon&introduction&依赖 +previous JobTracker and TaskTracker daemon&component&依赖 +introduction&mapreduce and hadoop version&AGGREGATION +previous JobTracker and TaskTracker daemon&another resource negotiator ( yarn )&依赖 +component&another resource negotiator ( yarn )&AGGREGATION +previous JobTracker and TaskTracker daemon&mapreduce and hadoop version&依赖 +ResourceManager&master node&依赖 +submission and scheduling&job&AGGREGATION +It&job&依赖 +NodeManager&slave node&依赖 +NodeManager&other daemon&依赖 +slave node&node&GENERALIZATION +MapReduce&massive cluster size&依赖 +MapReduce¶llel&依赖 +number&server&AGGREGATION +job&number&依赖 +cluster size&final result&依赖 +job&server&依赖 +job&results& +MapReduce&software development&实现 +MapReduce&C , C++ , Java , Ruby , Perl and Python&依赖 +MapReduce&several language&依赖 +programmer&MapReduce library&依赖 +node&status&依赖 +node&master node&依赖 +its&status& +master node&piece&依赖 +master node&cluster&依赖 +master node&job&依赖 +piece&job&AGGREGATION +master node&other available node&依赖 +its&ability& +result&node&AGGREGATION +power&MapReduce&AGGREGATION +user&time&依赖 +user&number&依赖 +user&time&依赖 +number&time&AGGREGATION +user&number&依赖 +user&26 people&依赖 +separate sheet&paper&AGGREGATION +user&task&依赖 +user&contrast&依赖 +map aspect&MapReduce&AGGREGATION +her&place& +MapReduce&element& +user&26 box&依赖 +user&single-word page&依赖 +26 box&first letter&依赖 +first letter&word&AGGREGATION +their&pages& +26 box&word&依赖 +user&a box and sort&依赖 +user&stack alphabetically&依赖 +number&reduce aspect&依赖 +number&MapReduce&依赖 +example&reduce aspect&AGGREGATION +number&reduce aspect&依赖 +number&reduce aspect&依赖 +number&MapReduce&依赖 +reduce aspect&MapReduce&AGGREGATION +number&page&AGGREGATION +number&MapReduce&依赖 +broad range&real-world use&AGGREGATION +social networking site&example&依赖 +social networking site&MapReduce&依赖 +users&friends& +historical behavior&user&AGGREGATION +booking website&MapReduce&依赖 +industrial facility&different sensor&依赖 +industrial facility&equipment datum&依赖 +industrial facility&installation&依赖 +Many business&capital and overhead&依赖 +Hadoop and MapReduce&enormous scalability&依赖 +organization&public cloud service&依赖 +organization&result&依赖 +Hadoop and MapReduce&minimal capital cost&依赖 +organization&Hadoop and MapReduce&依赖 +its&offering& +HDInsight service&provision Hadoop&依赖 +its&service& +Microsoft Azure&HDInsight service&依赖 +HDInsight service&user&依赖 +Hadoop and MapReduce&one option&依赖 +Hadoop and MapReduce&organization&依赖 +Spark and Hadoop cluster&private , on-premises big data infrastructure&依赖 +Organizations&Apache Spark&依赖 +Organizations&other platform&依赖 +big data framework&type&依赖 +big data framework&processing task&依赖 +type&processing task&AGGREGATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt new file mode 100644 index 0000000..0722022 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt @@ -0,0 +1,39 @@ +MapReduce +Stephen J. Bigelow +By +Stephen J. Bigelow, Senior Technology Editor +MapReduce is a core component of the Apache Hadoop software framework. + +Hadoop enables resilient, distributed processing of massive unstructured data sets across commodity computer clusters, in which each node of the cluster includes its own storage. MapReduce serves two essential functions: it filters and parcels out work to various nodes within the cluster or map, a function sometimes referred to as the mapper, and it organizes and reduces the results from each node into a cohesive answer to a query, referred to as the reducer. + +How MapReduce works +The original version of MapReduce involved several component daemons, including: + +JobTracker -- the master node that manages all the jobs and resources in a cluster; +TaskTrackers -- agents deployed to each machine in the cluster to run the map and reduce tasks; and +JobHistory Server -- a component that tracks completed jobs and is typically deployed as a separate function or with JobTracker. +With the introduction of MapReduce and Hadoop version 2, previous JobTracker and TaskTracker daemons have been replaced with components of Yet Another Resource Negotiator (YARN), called ResourceManager and NodeManager. + +ResourceManager runs on a master node and handles the submission and scheduling of jobs on the cluster. It also monitors jobs and allocates resources. +NodeManager runs on slave nodes and interoperates with Resource Manager to run tasks and track resource usage. NodeManager can employ other daemons to assist with task execution on the slave node. +To distribute input data and collate results, MapReduce operates in parallel across massive cluster sizes. Because cluster size doesn't affect a processing job's final results, jobs can be split across almost any number of servers. Therefore, MapReduce and the overall Hadoop framework simplify software development. + +MapReduce is available in several languages, including C, C++, Java, Ruby, Perl and Python. Programmers can use MapReduce libraries to create tasks without dealing with communication or coordination between nodes. + +MapReduce is also fault-tolerant, with each node periodically reporting its status to a master node. If a node doesn't respond as expected, the master node reassigns that piece of the job to other available nodes in the cluster. This creates resiliency and makes it practical for MapReduce to run on inexpensive commodity servers. + +MapReduce examples and uses +The power of MapReduce is in its ability to tackle huge data sets by distributing processing across many nodes, and then combining or reducing the results of those nodes. + +As a basic example, users could list and count the number of times every word appears in a novel as a single server application, but that is time-consuming. By contrast, users can split the task among 26 people, so each takes a page, writes a word on a separate sheet of paper and takes a new page when they're finished. This is the map aspect of MapReduce. And if a person leaves, another person takes his or her place. This exemplifies MapReduce's fault-tolerant element. + +When all the pages are processed, users sort their single-word pages into 26 boxes, which represent the first letter of each word. Each user takes a box and sorts each word in the stack alphabetically. The number of pages with the same word is an example of the reduce aspect of MapReduce. + +There is a broad range of real-world uses for MapReduce involving complex and seemingly unrelated data sets. For example, a social networking site could use MapReduce to determine users' potential friends, colleagues and other contacts based on site activity, names, locations, employers and many other data elements. A booking website could use MapReduce to examine the search criteria and historical behaviors of users, and can create customized offerings for each. An industrial facility could collect equipment data from different sensors across the installation and use MapReduce to tailor maintenance schedules or predict equipment failures to improve overall uptime and cost-savings. + +MapReduce services and alternatives +One challenge with MapReduce is the infrastructure it requires to run. Many businesses that could benefit from big data tasks can't sustain the capital and overhead needed for such an infrastructure. As a result, some organizations rely on public cloud services for Hadoop and MapReduce, which offer enormous scalability with minimal capital costs or maintenance overhead. + +For example, Amazon Web Services (AWS) provides Hadoop as a service through its Amazon Elastic MapReduce (EMR) offering. Microsoft Azure offers its HDInsight service, which enables users to provision Hadoop, Apache Spark and other clusters for data processing tasks. Google Cloud Platform provides its Cloud Dataproc service to run Spark and Hadoop clusters. + +For organizations that prefer to build and maintain private, on-premises big data infrastructures, Hadoop and MapReduce represent only one option. Organizations can opt to deploy other platforms, such as Apache Spark, High-Performance Computing Cluster and Hydra. The big data framework an enterprise chooses will depend on the types of processing tasks required, supported programming languages, and performance and infrastructure demands. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/MapReduce.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..be8f637081ad7e9390a5aa95e0570957a2922a26 GIT binary patch literal 18944 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 P+y6_&>%IL?&A@*FmmCIK literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop-relation.txt new file mode 100644 index 0000000..ad7368a --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop-relation.txt @@ -0,0 +1,223 @@ +component&Apache Hadoop ecosystem&AGGREGATION +Get start&MapReduce&依赖 +Apache Hadoop ecosystem&massive data processing&依赖 +hadoop december 6 , 2020 facebooktwitterlinkedin mapreduce&framework&依赖 +Apache Hadoop ecosystem&Hadoop ecosystem&GENERALIZATION +Get start&hadoop december 6 , 2020 facebooktwitterlinkedin mapreduce&依赖 +hadoop december 6 , 2020 facebooktwitterlinkedin mapreduce&Apache Hadoop ecosystem&依赖 +Other component&Apache Hadoop&AGGREGATION +MapReduce component&dispersed and parallel algorithm&依赖 +MapReduce component&processing&依赖 +MapReduce component&Hadoop ecosystem&依赖 +MapReduce component&massive datum&依赖 +processing&massive datum&AGGREGATION +understanding&MapReduce&AGGREGATION +MapReduce&real-life application&依赖 +It&reader&依赖 +It&insight&依赖 +vast volume&datum&AGGREGATION +write application&datum&依赖 +write application&large cluster&依赖 +vast amount&datum&AGGREGATION +write application&vast amount&依赖 +Hadoop framework&framework&GENERALIZATION +we&programming model&依赖 +we&computer cluster&依赖 +we&large dataset&依赖 +application&datum&依赖 +enormous volume&datum&AGGREGATION +It&enormous volume&实现 +It&datum&实现 +We&former task&依赖 +We&former task&依赖 +we&chunk&依赖 +input dataset&dataset&GENERALIZATION +we&map job&依赖 +we&input dataset&依赖 +map job&job&GENERALIZATION +Map task&chunk&依赖 +Map task&task&GENERALIZATION +Map task¶llell&依赖 +we&reduce task&依赖 +map&reduce task&依赖 +we&input&依赖 +we&output&依赖 +reducers process&intermediate datum&依赖 +reducers process&map&依赖 +final output&framework&AGGREGATION +reducers process&map&依赖 +reducers process&intermediate datum&依赖 +reducers process&intermediate datum&依赖 +reducers process&map&依赖 +smaller tuple&task&依赖 +reducers process&map&依赖 +reducers process&intermediate datum&依赖 +MapReduce framework&framework&GENERALIZATION +MapReduce framework&task&依赖 +MapReduce framework&scheduling and monitoring&依赖 +scheduling and monitoring&task&AGGREGATION +failed task&framework&依赖 +framework&distributed processing&依赖 +framework&programmer&依赖 +framework&little expertise&依赖 +MapReduce&overview&依赖 +MapReduce&MapReduce Architecture and MapReduce ’s phase&依赖 +overview&MapReduce Architecture and MapReduce ’s phase&AGGREGATION +MapReduce&overview&依赖 +MapReduce&MapReduce Architecture and MapReduce ’s phase&依赖 +diagram&MapReduce architecture&依赖 +MapReduce architecture&various component&依赖 +brief description&understanding&依赖 +brief description&component&AGGREGATION +brief description&works&依赖 +our&understanding& +piece&actual work&AGGREGATION +MapReduce job&job&GENERALIZATION +MapReduce job&many small task&依赖 +task tracker&tracker&GENERALIZATION +tracker&scheduling job&依赖 +tracker&role&依赖 +status&task&AGGREGATION +tracker&task&依赖 +job tracker&tracker&GENERALIZATION +result&mapping and reduce&AGGREGATION +a program or application programming&MapReduce&依赖 +a program or application programming&job&依赖 +MapReduce&job&依赖 +MapReduce&many client&依赖 +division&main job&AGGREGATION +client&job&依赖 +client&job&依赖 +client&MapReduce Master&依赖 +client&MapReduce Master&依赖 +master&job&依赖 +master&equal sub-part&依赖 +job-part&two main task&依赖 +job-part&MapReduce&依赖 +requirement&organization or company&AGGREGATION +developer&logic&依赖 +reducer&output&依赖 +reducer&final output&依赖 +MapReduce program&program&GENERALIZATION +diagram&simplified flow diagram&依赖 +diagram&MapReduce program&实现 +trackers&work&依赖 +job&two key component&依赖 +job&map task&依赖 +map task&role&依赖 +map task&job-part&依赖 +map task&task&GENERALIZATION +map task&splitting job&依赖 +reduce task&role&依赖 +reduce task&shuffling&依赖 +job tracker&act&依赖 +job tracker&master&依赖 +job tracker&master&依赖 +job tracker&act&依赖 +It&job&依赖 +job tracker schedule job&job tracker schedule job&依赖 +It&job&依赖 +task tracker&map task&依赖 +Task tracker&job tracker&依赖 +Task tracker&assigned job&依赖 +Task tracker&status&依赖 +status&assigned job&AGGREGATION +diagram&work&依赖 +MapReduce program&three main phase&依赖 +phase&MapReduce&AGGREGATION +combiner phase&phase&GENERALIZATION +first phase&program&AGGREGATION +Mapping Phase This&program&依赖 +splitting step&step&GENERALIZATION +dataset&equal unit&依赖 +dataset&splitting step&依赖 +splitting step&input split&依赖 +Hadoop&RecordReader&依赖 +splitting step&TextInputFormat&依赖 +key-value pair&mapping step&依赖 +key-value pair&input&依赖 +mapper&that&依赖 +mapping step&logic&依赖 +mapping step&step&GENERALIZATION +output&same form and ( key-value pair&AGGREGATION +mapper&key-value pair&依赖 +mapper&step&依赖 +second phase&completion&依赖 +second phase&Mapping phase&依赖 +completion&Mapping phase&AGGREGATION +Mapping phase&phase&GENERALIZATION +second phase&place&依赖 +It&two main step ###&依赖 +It&two main step&依赖 +shuffling phase&duplicate value&依赖 +shuffling phase&removal&依赖 +removal&duplicate value&AGGREGATION +grouping&value&AGGREGATION +output&phase&AGGREGATION +output&Reducer phase&依赖 +output&reducer phase&依赖 +output&shuffling phase&AGGREGATION +output&input&依赖 +shuffling phase&phase&GENERALIZATION +Reducer phase&phase&GENERALIZATION +reducer&input&依赖 +summary&entire dataset&AGGREGATION +output&hdf&依赖 +diagram&example&依赖 +example&MapReduce&AGGREGATION +diagram&three main phase&依赖 +Example&MapReduce&AGGREGATION +duplicate output&phase&依赖 +duplicate output&single output&依赖 +combiner phase&Shuffling phase&依赖 +Shuffling phase&phase&GENERALIZATION +performance&Jobs&AGGREGATION +four phase&MapReduce&AGGREGATION +benefit&Hadoop MapReduce Speed&AGGREGATION +MapReduce&huge unstructured datum&依赖 +MapReduce&short time&依赖 +MapReduce framework&failure&依赖 +scale-out feature&process or store datum&依赖 +Hadoop&scale-out feature&依赖 +scale-out feature&cost-effective manner&依赖 +scale-out feature&user&依赖 +MapReduce&user&依赖 +MapReduce&application&依赖 +replica&network&依赖 +replica&various node&依赖 +replica&datum&AGGREGATION +event&failure&AGGREGATION +copy&datum&AGGREGATION +multiple job-part&same dataset&AGGREGATION +multiple job-part&MapReduce&依赖 +multiple job-part¶llel manner&依赖 +practical application&MapReduce program&AGGREGATION +hadoop mapreduce&practical application&依赖 +hadoop mapreduce&MapReduce program&依赖 +application&hadoop mapreduce&AGGREGATION +E-commerce E-commerce company&MapReduce&依赖 +E-commerce E-commerce company&MapReduce&依赖 +Social network&certain information&依赖 +Social network&Facebook , Twitter , and LinkedIn&依赖 +Social network&Facebook , Twitter , and LinkedIn&依赖 +Social network&certain information&依赖 +Social network&social media platform&依赖 +Social network&social media platform&依赖 +who&status&依赖 +It&important information&依赖 +your&status& +who&profile&依赖 +It&status&依赖 +your&profile& +Entertainment Netflix&MapReduce&依赖 +clicks and log&online customer&AGGREGATION +customer&interests and behavior&依赖 +information&movie&依赖 +crucial processing component&Hadoop framework&AGGREGATION +Conclusion MapReduce&MapReduce&GENERALIZATION +Conclusion MapReduce&Hadoop framework&依赖 +quick , scalable , and cost-effective program&huge datum&依赖 +It&quick , scalable , and cost-effective program&依赖 +company&framework&依赖 +company&framework&依赖 +their&strategies& diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt new file mode 100644 index 0000000..43986d4 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt @@ -0,0 +1,178 @@ +select_all Edge AppSpace +SolutionHub +Performance / CDN +Security +Virtual Waiting Room +A/B Testing +Search AppSpace +AppStack +Node.js Edge Hosting +RunStack +Containers +Serverless +gps_fixed Core Platform +Section Control Plane +Edge AppSpace +Adaptive Edge Engine (AEE) +Global Edge Network +Solutions +SaaS +PaaS & Hosting Providers +Edge App Hosting +Docs +Resources +Blog +Case Studies +Edge Content Library +Solution Briefs +Product Videos +Engineering Education +About Section +Partners +Changelog +Pricing +Contact Log In Get Started +Platform +select_allEdge AppSpace +SolutionHub +Performance / CDN +Security +Virtual Waiting Room +A/B Testing +AppStack +Node.js Edge Hosting +RunStack +Containers +Serverless +Search AppSpace +gps_fixedCore Platform +Section Control Plane +Edge AppSpace +Adaptive Edge Engine (AEE) +Global Edge Network +Docs +Resources +Blog +Case Studies +Content Library +Solution Briefs +Changelog +Engineering Education +Partners +About Section +Pricing +Contact +Log In +Get Started +Understanding MapReduce in Hadoop +December 6, 2020 +FacebookTwitterLinkedIn +MapReduce is a component of the Apache Hadoop ecosystem, a framework that enhances massive data processing. Other components of Apache Hadoop include Hadoop Distributed File System (HDFS), Yarn, and Apache Pig. + +The MapReduce component enhances the processing of massive data using dispersed and parallel algorithms in the Hadoop ecosystem. This programming model is applied in social platforms and e-commerce to analyze huge data collected from online users. + +This article provides an understanding of MapReduce in Hadoop. It will enable readers to gain insights on how vast volumes of data is simplified and how MapReduce is used in real-life applications. + +Introduction to MapReduce in Hadoop +MapReduce is a Hadoop framework used for writing applications that can process vast amounts of data on large clusters. It can also be called a programming model in which we can process large datasets across computer clusters. This application allows data to be stored in a distributed form. It simplifies enormous volumes of data and large scale computing. + +There are two primary tasks in MapReduce: map and reduce. We perform the former task before the latter. In the map job, we split the input dataset into chunks. Map task processes these chunks in parallell. The map we use outputs as inputs for the reduce tasks. Reducers process the intermediate data from the maps into smaller tuples, that reduces the tasks, leading to the final output of the framework. + +The MapReduce framework enhances the scheduling and monitoring of tasks. The failed tasks are re-executed by the framework. This framework can be used easily, even by programmers with little expertise in distributed processing. MapReduce can be implemented using various programming languages such as Java, Hive, Pig, Scala, and Python. + +How MapReduce in Hadoop works +An overview of MapReduce Architecture and MapReduce’s phases will help us understand how MapReduce in Hadoop works. + +MapReduce architecture +The following diagram shows a MapReduce architecture. + +MapReduce Architecture + +Image Source: A4Academics + +MapReduce architecture consists of various components. A brief description of these components can improve our understanding on how MapReduce works. + +Job: This is the actual work that needs to be executed or processed +Task: This is a piece of the actual work that needs to be executed or processed. A MapReduce job comprises many small tasks that need to be executed. +Job Tracker: This tracker plays the role of scheduling jobs and tracking all jobs assigned to the task tracker. +Task Tracker: This tracker plays the role of tracking tasks and reporting the status of tasks to the job tracker. +Input data: This is the data used to process in the mapping phase. +Output data: This is the result of mapping and reducing. +Client: This is a program or Application Programming Interface (API) that submits jobs to the MapReduce. MapReduce can accept jobs from many clients. +Hadoop MapReduce Master: This plays the role of dividing jobs into job-parts. +Job-parts: These are sub-jobs that result from the division of the main job. +In the MapReduce architecture, clients submit jobs to the MapReduce Master. This master will then sub-divide the job into equal sub-parts. The job-parts will be used for the two main tasks in MapReduce: mapping and reducing. + +The developer will write logic that satisfies the requirements of the organization or company. The input data will be split and mapped. + +The intermediate data will then be sorted and merged. The reducer that will generate a final output stored in the HDFS will process the resulting output. + +The following diagram shows a simplified flow diagram for the MapReduce program. + +MapReduce Flow Diagram + +Image Source: Data Flair + +How job trackers and task trackers work +Every job consists of two key components: mapping task and reducing task. The map task plays the role of splitting jobs into job-parts and mapping intermediate data. The reduce task plays the role of shuffling and reducing intermediate data into smaller units. + +The job tracker acts as a master. It ensures that we execute all jobs. The job tracker schedules jobs that have been submitted by clients. It will assign jobs to task trackers. Each task tracker consists of a map task and reduces the task. Task trackers report the status of each assigned job to the job tracker. The following diagram summarizes how job trackers and task trackers work. + +Job Trackers and Task Trackers + +Image Source: CNBlogs + +Phases of MapReduce +The MapReduce program is executed in three main phases: mapping, shuffling, and reducing. There is also an optional phase known as the combiner phase. + +Mapping Phase +This is the first phase of the program. There are two steps in this phase: splitting and mapping. A dataset is split into equal units called chunks (input splits) in the splitting step. Hadoop consists of a RecordReader that uses TextInputFormat to transform input splits into key-value pairs. + +The key-value pairs are then used as inputs in the mapping step. This is the only data format that a mapper can read or understand. The mapping step contains a coding logic that is applied to these data blocks. In this step, the mapper processes the key-value pairs and produces an output of the same form (key-value pairs). + +Shuffling phase +This is the second phase that takes place after the completion of the Mapping phase. It consists of two main steps: sorting and merging. In the sorting step, the key-value pairs are sorted using the keys. Merging ensures that key-value pairs are combined. + +The shuffling phase facilitates the removal of duplicate values and the grouping of values. Different values with similar keys are grouped. The output of this phase will be keys and values, just like in the Mapping phase. + +Reducer phase +In the reducer phase, the output of the shuffling phase is used as the input. The reducer processes this input further to reduce the intermediate values into smaller values. It provides a summary of the entire dataset. The output from this phase is stored in the HDFS. + +The following diagram shows an example of a MapReduce with the three main phases. Splitting is often included in the mapping stage. + +Example of MapReduce + +Image Source: Edureka + +Combiner phase +This is an optional phase that’s used for optimizing the MapReduce process. It’s used for reducing the pap outputs at the node level. In this phase, duplicate outputs from the map outputs can be combined into a single output. The combiner phase increases speed in the Shuffling phase by improving the performance of Jobs. + +The following diagram shows how all the four phases of MapReduce have been applied. + +MapReduce with Combiner Phase + +Image Source: Cloud Front + +Benefits of Hadoop MapReduce +Speed: MapReduce can process huge unstructured data in a short time. +Fault-tolerance: The MapReduce framework can handle failures. +Cost-effective: Hadoop has a scale-out feature that enables users to process or store data in a cost-effective manner. +Scalability: Hadoop provides a highly scalable framework. MapReduce allows users to run applications from many nodes. +Data availability: Replicas of data are sent to various nodes within the network. This ensures copies of the data are available in the event of failure. +Parallel Processing: In MapReduce, multiple job-parts of the same dataset can be processed in a parallel manner. This reduces the time taken to complete a task. +Applications of Hadoop MapReduce +The following are some of the practical applications of the MapReduce program. + +E-commerce +E-commerce companies such as Walmart, E-Bay, and Amazon use MapReduce to analyze buying behavior. MapReduce provides meaningful information that is used as the basis for developing product recommendations. Some of the information used include site records, e-commerce catalogs, purchase history, and interaction logs. + +Social networks +The MapReduce programming tool can evaluate certain information on social media platforms such as Facebook, Twitter, and LinkedIn. It can evaluate important information such as who liked your status and who viewed your profile. + +Entertainment +Netflix uses MapReduce to analyze the clicks and logs of online customers. This information helps the company suggest movies based on customers’ interests and behavior. + +Conclusion +MapReduce is a crucial processing component of the Hadoop framework. It’s a quick, scalable, and cost-effective program that can help data analysts and developers process huge data. + +This programming model is a suitable tool for analyzing usage patterns on websites and e-commerce platforms. Companies providing online services can utilize this framework to improve their marketing strategies. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Understanding MapReduce in Hadoop.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..a5b6491de17c059764cf9ae23f2108a1ecd86f2c GIT binary patch literal 31232 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 b2{Y8)e9?b5!>Vb?d-N!Om*KVZ|0(p}rF`^C literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce-relation.txt new file mode 100644 index 0000000..ffe9e69 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce-relation.txt @@ -0,0 +1,7 @@ +component&MapReduce JobTracker&AGGREGATION +master&job&依赖 +main component&mapreduce job tracker job tracker&AGGREGATION +JobTracker&TaskTrackers&依赖 +JobTracker&job&依赖 +status&task&AGGREGATION +TaskTracker&task&依赖 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt new file mode 100644 index 0000000..92be416 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt @@ -0,0 +1,6 @@ +What are the components of MapReduce +JobTracker and TaskTracker are the main components of the mapreduce +Job Tracker +Job Tracker is a master which creates and runs the job. JobTracker that runs on name node, allocates the job to TaskTrackers. +TaskTracker +TaskTracker is a slave and runs on data node. TaskTracker runs the tasks and reports the status of task to JobTracker. \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/What are the components of MapReduce.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..098b139dbcddcf69f1a0a9272e7a122d3f3f9eb1 GIT binary patch literal 5120 zcmeHKO>7%Q6rNps?SwXQeo6y@rdy|h#4(UmMM6X+N!t(wsV#DX08wN%&WfgSyk@;Y zDi=(FTaiFqxs)3hpcjw;A#&qT2?PfuE~H$zAt8app{@D8H(vkcM;t07+KlyP_I>l_ zy*D#&W}d(Qu6yJ1mHun0rA(-Zx>;#gu?E~|_*Pv?nc#`ttW+xO;x|5b%l~KvGRng* zP_~*;1+>1pz^(k(WxukFaJo(Lv4e&P`}SyoXJOq}D{4{vSlMCJ)?Gcytl6g@TT5+5 zf4gflb|)e{yEi~=qgVh7#4{fUwSkE5mfLp)cxHKz^Gt5F|LwqeRCrwXf;vE*pacj{ zfa(VIfO|xE038I`phKV}Xb^N5Gz5A8^dM*$Gy+P2 zMnSu=ck=2gf18B5H4=JRi;^!7JL*ZYfPyu4W#VQqbfTr{K!O= zO+J)_KiT1_EG(pPEO9`y!;Pa-c6~_7ZjwKy(hA$rXh?hBWQ$HUn46re8$62h|44(u zaCB(1I#kTo$8E@sq|{#(EJv+;V-x2l3;t)=u`|wi+e&^roLaY%znyV|VOJ~RdXDOK z_&e+f@sVxt^fq{E8@zoJ{=OMiUFArHZFe~)ZBIEWZEra)ttu;N_m!>6OL7mqjoW2I z{_e!o{5jVR#xCJSH1PY_kT%+fgH^p8)OGcm!S{)88U|(DSF&>_@i5MNYktnnp707e zw-^9eaQv6uAO!GCPM1nvZrKTzy#mp|Ed+Q}Gj3i(3m1wm9@?2#o&1_c#+%tAc&1N# zfs4q?jPqLdR*PN%TJZdya*DVy)^e`>l()FxJGm9t$ICrEJDZuAonDwba~i&`I;Ft% z@!+5L7TGyJf9AxTbRy}?`K}YVB{;t7EEnvW@n@UTGzK!2@Js;DIP;v|w)<|JRB zy@<9CV}C*W9@^)zQOsNP`_`qt?6?|V2ahhb$7H6W3v*nS4(H>%}+DChg2E&X&lJ@i%+CqQ{$CavU;O-|Rx+rPlmyq07bJV~LSaa0EJtD_> z)U`xJ3wKNRQ42F>`Vp!55y5=xesJyy$*DPpH%~&cYt2yuBT94hgBiEx8vWp!)wNhn zTCAqoSmFnBc51Q2mvA;*>xAU;?Bm)cB&*jPePMpj*>FC3Rbx%F;r`S$#6<)D4^Tr~ z{GbNSQ3L-cXfB-1PnhrT*qlqqLXWE_g;+mf_NdS3pqgS;EeD{3dw^0sQ80wVxLpy+ HJGlA>hBMrB literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2-relation.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2-relation.txt new file mode 100644 index 0000000..93e8514 --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2-relation.txt @@ -0,0 +1,520 @@ +each a set&key/value pair&AGGREGATION +mapreduce & hadoop ii mingshen sun chinese university&hong kong mssun@cse.cuhk.edu.hk mingshen sun ( cuhk ) mapreduce & hadoop outline • mapreduce recap • design pattern&AGGREGATION +set&value&AGGREGATION +set&intermediate key/value pairs • Reduce&AGGREGATION +number&partition&AGGREGATION +value&reducer 3 mingshen sun ( cuhk ) mapreduce & hadoop mapreduce recap • optional&依赖 +set&output value • MapReduce framework guarantee&AGGREGATION +v2 ) •&intermediate key/value pairs • Reduce&依赖 +v2 ) •&set&依赖 +simple hash&key and e.g.&AGGREGATION +v3 ) •&set&依赖 +v3 ) •&output value • MapReduce framework guarantee&依赖 +v2 ’ ) • mini-reducer&later 4 mingshen sun ( cuhk ) mapreduce & hadoop mapreduce recap 5 30 chapter 2&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&MapReduce&AGGREGATION +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 1 b 2 c 9&依赖 +we&multitude&依赖 +a 1 5 b 2 7 c 2 9 8 p p p p reducer reducer reducer x&7 z 9 figure 2.4&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&2 b&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 5 c&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&2 b&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&2 b&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 5 c&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 5 c&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 1 b 2 c 9&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&依赖 +multitude&algorithm&AGGREGATION +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&2 b&依赖 +we&multitude&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 1 b 2 c 9&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 5 c&依赖 +we&algorithm&依赖 +we&algorithm&依赖 +7 c 8 partitioner partitioner partitioner partitioner shuffle and sort&a 1 b 2 c 9&依赖 +all term t 2 doc d&4&依赖 +[ c1&] ) 3&依赖 +[ c1&] ) 3&依赖 +[ c1&] ) 3&依赖 +[ c1&sum 0 4&依赖 +[ c1&sum 0 4&依赖 +[ c1&sum 0 4&依赖 +[ c1&] ) 3&依赖 +[ c1&sum 0 4&依赖 +] do 5&] do 5&依赖 +sum sum + c 6&basic word count algorithm&依赖 +sum sum + c 6&basic word count algorithm&依赖 +sum sum + c 6&basic word count algorithm&依赖 +sum sum + c 6&basic word count algorithm&依赖 +amount&intermediate datum&AGGREGATION +Section 2.4&output&依赖 +output&mapper&AGGREGATION +Section 2.4&mapper&依赖 +1 • in-mapper combine •&unique term&依赖 +1 • in-mapper combine •&key-value pair&依赖 +1 • in-mapper combine •&document 17 3.1&依赖 +term t 2 doc d&5&依赖 +Emit&entire document 6&依赖 +Emit&entire document 6&依赖 +Emit&entire document 6&依赖 +Emit&all term t&依赖 +Emit&all term t&依赖 +Emit&entire document 6&依赖 +2 h&7&依赖 +Emit&all term t&依赖 +Emit&all term t&依赖 +workings&detail&依赖 +workings&detail&依赖 +workings&algorithm critically&AGGREGATION +block&input count entire document mingshen sun ( cuhk ) mapreduce & hadoop word count&AGGREGATION +term t 2 doc d&6&依赖 +2 h&{ t } ) figure 3.3&依赖 +improved MapReduce word count algorithm&“ in-mapper combine ” design pattern&依赖 +Reducer&Figure 3.1&依赖 +Hadoop&example&依赖 +it&all&依赖 +Hadoop&guarantee&依赖 +execution framework&it&依赖 +execution framework&option&依赖 +In-Mapper Combiners • advantage&in-mapper combiner&AGGREGATION +local aggregation&place&依赖 +semantics&MapReduce&依赖 +semantics&contrast&依赖 +semantics&default combiner&AGGREGATION +Default combiner&map output&依赖 +• state&> potentially large memory overhead&依赖 +• state&mapper&依赖 +• algorithmic behavior&> potential order-dependent bug&依赖 +input keyvalue pair&> potential order-dependent bug&依赖 +input keyvalue pair&order&依赖 +• algorithmic behavior&order&依赖 +• with/without combiner&algorithm correctness •&依赖 +you&Java&依赖 +algorithm correctness •&0 , 1&依赖 +you&combiner class&依赖 +version 1 •&drawback&依赖 +•&reducer&依赖 +• i.e.&set combiner class&依赖 +• i.e.&reducer class 21 3.1&依赖 +r1 , r2&cnt 0 5&依赖 +r1 , r2&sum 0 4&依赖 +r1 , r2&] ) 3&依赖 +r1 , r2&cnt 0 5&依赖 +r1 , r2&] ) 3&依赖 +r1 , r2&sum 0 4&依赖 +mean&value&AGGREGATION +basic MapReduce algorithm&mean&依赖 +]&6&依赖 +MapReduce algorithm&algorithm&GENERALIZATION +]&basic MapReduce algorithm&依赖 +basic MapReduce algorithm&value&依赖 +value&mean&依赖 +value&mean&依赖 +value&value&依赖 +value&value&依赖 +mean ( 1 , 2 , 3 , 4 , 5 ) 6 = mean ( mean ( 1 , 2 )&basic MapReduce algorithm&依赖 +mean ( 1 , 2 , 3 , 4 , 5 ) 6 = mean ( mean ( 1 , 2 )&basic MapReduce algorithm&依赖 +mean ( 1 , 2 , 3 , 4 , 5 ) 6 = mean ( mean ( 1 , 2 )&basic MapReduce algorithm&依赖 +we&concrete example&依赖 +mean ( 1 , 2 , 3 , 4 , 5 ) 6 = mean ( mean ( 1 , 2 )&basic MapReduce algorithm&依赖 +mean ( 1 , 2 , 3 , 4 , 5 ) 6 = mean ( mean ( 1 , 2 )&basic MapReduce algorithm&依赖 +Version 1 • Mean&means&AGGREGATION +it&problem&依赖 +It&a problem&依赖 +It&Word Count problem&依赖 +optimization&algorithm 23 48 chapter 3&依赖 +correctness&algorithm 23 48 chapter 3&AGGREGATION +r 7&Emit&依赖 +r 7&1 8&依赖 +r 7&1 8&依赖 +r 7&( string t&依赖 +r 7&Emit&依赖 +r 7&pair ( sum&依赖 +r 7&pair ( sum&依赖 +r 7&( string t&依赖 +sum sum +&incorrect first attempt&依赖 +sum sum +&combiner&依赖 +mismatch&MapReduce programming model&依赖 +MapReduce programming model&programming model&GENERALIZATION +mismatch&MapReduce programming model&依赖 +sum sum +&value&依赖 +sum sum +&mean&依赖 +mismatch&MapReduce programming model&依赖 +We&complex key and value&依赖 +optimization&correctness&依赖 +correctness&algorithm&AGGREGATION +restriction&programming model&依赖 +optimization&algorithm&依赖 +combiner&value&依赖 +combiner&integer&依赖 +combiner&list&依赖 +output value type&reducer&AGGREGATION +list&integer&AGGREGATION +list&pair&AGGREGATION +it&mingshen sun ( cuhk ) mapreduce & hadoop computing&依赖 +it&Version 3 •&依赖 +cnt cnt + c 8&Mean&依赖 +cnt cnt + c 8&Mean&依赖 +cnt cnt + c 8&Mean&依赖 +cnt cnt + c 8&Mean&依赖 +integer ravg ) figure 3.6&value&依赖 +cnt cnt + c 8&Mean&依赖 +integer ravg ) figure 3.6&mean&依赖 +integer ravg ) figure 3.6&mingshen sun ( cuhk ) mapreduce & hadoop computing&依赖 +•&combiner&依赖 +25 50 chapter 3&25 50 chapter 3&依赖 +MapReduce algorithm&value&依赖 +MapReduce algorithm&mean&依赖 +2&10&依赖 +reducer&Figure 3.6 and one&依赖 +reducer&correct sum and count&依赖 +combiner&aggregate partial sum&依赖 +they&many time&依赖 +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&reducer&依赖 +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&input key-value type&依赖 +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&reducer&依赖 +input key-value type&reducer&AGGREGATION +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&input key-value type&依赖 +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&reducer&依赖 +performance&computation&AGGREGATION +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&依赖 +output key-value type&combiner&AGGREGATION +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&依赖 +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&依赖 +reducer mingshen sun ( cuhk ) mapreduce & hadoop pairs&input key-value type&依赖 +• m = n * n matrix ( n = number&unique word&AGGREGATION +26 mingshen sun ( cuhk ) mapreduce & hadoop a new run example • problem&time word w&依赖 +26 mingshen sun ( cuhk ) mapreduce & hadoop a new run example • problem&time word w&依赖 +26 mingshen sun ( cuhk ) mapreduce & hadoop a new run example • problem&time word w&依赖 +26 mingshen sun ( cuhk ) mapreduce & hadoop a new run example • problem&time word w&依赖 +[ j ] = number&time word w&AGGREGATION +26 mingshen sun ( cuhk ) mapreduce & hadoop a new run example • problem&time word w&依赖 +26 mingshen sun ( cuhk ) mapreduce & hadoop a new run example • problem&time word w&依赖 +distributional profile&word&AGGREGATION +we&whole matrix&实现 +billion&word&AGGREGATION +single machine&MapReduce&依赖 +single machine&whole matrix •&依赖 +each co-occur word pair and integer 1 •&use&依赖 +•&aggregate partial count&依赖 +default combiner&combiner&GENERALIZATION +each co-occur word pair and integer 1 •&reducer&依赖 +• mapper&partial count&依赖 +28 mingshen sun ( cuhk ) mapreduce & hadoop pairs&approach&依赖 +28 mingshen sun ( cuhk ) mapreduce & hadoop pairs&approach&依赖 +we&default combiner&依赖 +Our&approach& +term w 2 doc d&4&依赖 +2 neighbor and ( w&5&依赖 +[ c1&s 0 4&依赖 +[ c1&s 0 4&依赖 +[ c1&s 0 4&依赖 +[ c1&s 0 4&依赖 +Sum co-occurrence&figure 3.8 ( pair p&依赖 +Sum co-occurrence&count s&依赖 +Sum co-occurrence&( pair p&依赖 +h1 , h2 , h3&Hf new AssociativeArray 4&依赖 +h1 , h2 , h3&] ) 3&依赖 +h1 , h2 , h3&] ) 3&依赖 +h1 , h2 , h3&Hf new AssociativeArray 4&依赖 +] do 5&sum ( hf&依赖 +huge • both pair and stripe&in-mapper combine 34 mingshen sun ( cuhk ) mapreduce & hadoop pairs v.s.&依赖 +better use&combiners • Con&AGGREGATION +Memory size&associative array&AGGREGATION +) percentage ( second&approach figure 3.10&依赖 +) percentage ( second&stripe&依赖 +) percentage ( second&stripe&依赖 +time&” algorithm&AGGREGATION +) percentage ( second&" approach " pair&依赖 +) percentage ( second&" approach " pair&依赖 +) percentage ( second&apw corpus r2 = 0.992 r2 = 0.999&依赖 +) percentage ( second&stripe&依赖 +) percentage ( second&stripe&依赖 +) percentage ( second&approach figure 3.10&依赖 +) percentage ( second&apw corpus r2 = 0.992 r2 = 0.999&依赖 +approach figure 3.10&apw corpus r2 = 0.992 r2 = 0.999&AGGREGATION +) percentage ( second&approach figure 3.10&依赖 +) percentage ( second&" approach " pair&依赖 +word cooccurrence matrix&APW corpus&AGGREGATION +di ↵ erent fraction&APW corpus&AGGREGATION +) percentage ( second&apw corpus r2 = 0.992 r2 = 0.999&依赖 +) percentage ( second&apw corpus r2 = 0.992 r2 = 0.999&依赖 +) percentage ( second&approach figure 3.10&依赖 +) percentage ( second&" approach " pair&依赖 +experiment&19 slave and ###&依赖 +experiment&Hadoop cluster&依赖 +experiment&19 slave and&依赖 +“&” • estimate relative frequency&依赖 +“&counts •&依赖 +we&MapReduce&依赖 +we&problem&依赖 +drawback&co-occurrence count&AGGREGATION +counts •&•&GENERALIZATION +other&itself&依赖 +36 Relative Frequencies Drawback&co-occurrence count&AGGREGATION +good ”&“ hello world ” estimate relative frequency&依赖 +good ”&MapReduce&依赖 +we&problem&依赖 +31&count& +use&partitioner&GENERALIZATION +sure same word&same reducer ( use and null&依赖 +sure same word&partitioner&依赖 +) • reducer&state&依赖 +order&key&AGGREGATION +• MapReduce&key&依赖 +• MapReduce&MapReduce&GENERALIZATION +• MapReduce&you&依赖 +• MapReduce&sort 39 mingshen sun ( cuhk ) mapreduce & hadoop order inversion&依赖 +• MapReduce&order&依赖 +• MapReduce&Idea •&依赖 +design pattern&order inversion&AGGREGATION +Idea •&•&GENERALIZATION +what&value&依赖 +individual count&same reducer • Preserve state&依赖 +sort order&intermediate key&AGGREGATION +computation&marginal • Control&AGGREGATION +individual count&reducer&依赖 +reading&reducer • buffer value&依赖 +• naive solution •&v ) •&依赖 +• naive solution •&> ( t&依赖 +reading&memory&依赖 +reading&id&依赖 +• naive solution •&• id&依赖 +• sensors record temperature&temperature v ) 41 mingshen sun ( cuhk ) mapreduce & hadoop secondary&依赖 +• sensors record temperature&temperature v ) 41 mingshen sun ( cuhk ) mapreduce & hadoop secondary&依赖 +reading&sensor id&AGGREGATION +•&processing • anything&依赖 +•&multiple key-value pair&依赖 +•&state&依赖 +• value-to-key conversion •&• ( id&依赖 +sorting&43 mingshen sun ( cuhk ) mapreduce & hadoop tools&依赖 +in-mapper combine • ram vs. disk&in-mapper combine • ram vs. disk&依赖 +in-mapper combine • ram vs. disk&• main idea&依赖 +in-mapper combine • ram vs. disk&• main idea&依赖 +reducers process key&• Control order&依赖 +key&local aggregation&依赖 +reducer process&which&依赖 +sorting&Synchronization • Cleverly-constructed data structure&依赖 +44 mingshen sun ( cuhk ) mapreduce & hadoop issues and tradeoffs • number&key-value pair&AGGREGATION +reducers process key&Scale • Works&依赖 +sorting&reducer ( 43 mingshen sun ( cuhk ) mapreduce & hadoop tools&依赖 +in-mapper combine • ram vs. disk&• main idea&依赖 +reducers process key&small dataset&依赖 +in-mapper combine • ram vs. disk&in-mapper combine • ram vs. disk&依赖 +reducers process key&Partitioner • Control&依赖 +in-mapper combine • ram vs. disk&in-mapper combine • ram vs. disk&依赖 +reducer process&a big difference • combiner&依赖 +reducers process key&Partitioner • Control&依赖 +in-mapper combine • ram vs. disk&• main idea&依赖 +key&local aggregation&依赖 +data together • Sort order&intermediate key&AGGREGATION +in-mapper combine • ram vs. disk&in-mapper combine • ram vs. disk&依赖 +network • Size&each key-value pair • de/serialization overhead&AGGREGATION +• Memory management issue&mangled input record&依赖 +• Memory management issue&mangled input record&依赖 +list&posting&AGGREGATION +• Each term&posting&依赖 +• Each term&list&依赖 +document id&id&GENERALIZATION +• Each post&document id&依赖 +INVERTED INDEXING&1 4 11 19 figure 4.1&依赖 +INVERTED INDEXING&1 4 11 19 figure 4.1&依赖 +Simple illustration&inverted index&AGGREGATION +term&list posting&依赖 +postings list&list&GENERALIZATION +front&postings list&AGGREGATION +auxiliary data structure&integer document id&依赖 +auxiliary data structure&mapping&依赖 +retrieval&postings list&依赖 +large •&MapReduce&依赖 +large •&MapReduce&依赖 +large •&MapReduce&依赖 +“&” )&AGGREGATION +54 mingshen sun ( cuhk ) mapreduce & hadoop baseline implementation •&goal&依赖 +Our&goal& +54 mingshen sun ( cuhk ) mapreduce & hadoop baseline implementation •&construct&依赖 +• actual document content ( value&What&依赖 +• Analyze&each document and extract useful term&依赖 +reducer&What&依赖 +reducer&term&依赖 +reducer&• Aggregates all observed posting&依赖 +2 H&posting p ) mingshen sun ( cuhk ) mapreduce & hadoop baseline implementation 57 4.4&依赖 +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +implementation 77 one fish&inverted indexing&依赖 +implementation 77 one fish&aggregate value&依赖 +implementation 77 one fish&aggregate value&依赖 +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +input&view •&依赖 +view •&•&GENERALIZATION +input&’s point&依赖 +posting&term •&AGGREGATION +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +implementation 77 one fish&inverted indexing&依赖 +• Reducer&list (&依赖 +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +implementation 77 one fish&aggregate value&依赖 +• Reducer&Reducer&GENERALIZATION +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +reducer&point& +list&term&AGGREGATION +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +input&term&依赖 +implementation 77 one fish&inverted indexing&依赖 +implementation 77 one fish&aggregate value&依赖 +implementation 77 one fish&aggregate value&依赖 +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +implementation 77 one fish&inverted indexing&依赖 +input&’s point&依赖 +• Reducer&need )&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +implementation 77 one fish&aggregate value&依赖 +input&term&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +1 red d2 1 d3 1 d3 1 simple illustration&baseline inverted indexing algorithm&AGGREGATION +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +input&view •&依赖 +implementation 77 one fish&inverted indexing&依赖 +implementation 77 one fish&inverted indexing&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +task&reducer&AGGREGATION +implementation 77 one fish&inverted indexing&依赖 +1 red d2 1 d3 1 d3 1 simple illustration&large , distributed group&依赖 +implementation 77 one fish&aggregate value&依赖 +implementation 77 one fish&2 one red bird doc 3 mapper mapper mapper fish&依赖 +implementation 77 one fish&aggregate value&依赖 +’s point&view •&AGGREGATION +implementation 77 one fish&2 red d2 1 bird d3 1 one d3 1 red d3 1 reducer shuffle and sort&依赖 +implementation 77 one fish&inverted indexing&依赖 +MapReduce framework&most heavy lifting&依赖 +two fish doc&aggregate value&实现 +two fish doc&aggregate value&实现 +two fish doc&aggregate value&实现 +Doc&hat& +two fish doc&aggregate value&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&aggregate value&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&依赖 +two fish doc&aggregate value&实现 +two fish doc&aggregate value&依赖 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +Positional&fish& +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&aggregate value&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&aggregate value&实现 +two fish doc&aggregate value&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&aggregate value&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&依赖 +two fish doc&aggregate value&实现 +two fish doc&aggregate value&实现 +two fish doc&aggregate value&依赖 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&aggregate value&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +two fish doc&3 fish 1 2 one 1 two 1 red 2 cat 3 blue 2 hat 3 shuffle and sort&实现 +5&2 H&依赖 +5&2 H&依赖 +5&2 H&依赖 +5&2 H&依赖 +5&2 H&依赖 +5&2 H&依赖 +hn1 , f1us , hn2 and f2us&P new List 4&依赖 +hn1 , f1us , hn2 and f2us&] ) 3&依赖 +] do 5&] do 5&依赖 +] do 5&sort ( p ) 7&依赖 +] do 5&] do 5&依赖 +] do 5&] do 5&依赖 +] do 5&sort ( p ) 7&依赖 +] do 5&sort ( p ) 7&依赖 +] do 5&sort ( p ) 7&依赖 +] do 5&baseline inverted indexing algorithm&AGGREGATION +• Reducer&sufficient memory&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop scalability issue • assumption&baseline implementation&AGGREGATION +• Reducer&posting&依赖 +reducer first buffer&posting line 5 )&依赖 +reducer first buffer&line 5 )&依赖 +Key idea&MapReduce framework&依赖 +tuple&same reducer&依赖 +63 mingshen sun ( cuhk ) mapreduce & hadoop revise implementation 64 4.5&62 mingshen sun ( cuhk ) mapreduce & hadoop revise implementation •&依赖 +63 mingshen sun ( cuhk ) mapreduce & hadoop revise implementation 64 4.5&disk directly • caution&依赖 +you&customized partitioner&依赖 +tuple&same reducer&依赖 +2 h&scalable inverted indexing algorithm&依赖 +7&scalable inverted indexing algorithm&AGGREGATION +2 h&MapReduce&依赖 +2 h&MapReduce&依赖 +2 h&7&依赖 +2 h&scalable inverted indexing algorithm&依赖 +you&MapReduce&依赖 +you&graph&依赖 +70 mingshen sun ( cuhk ) mapreduce & hadoop graph representations • two common representation&71 5.1&依赖 +linear algebra • easy algorithmic implementation • large memory space and esp&linear algebra • easy algorithmic implementation • large memory space and esp&依赖 +graph • shortest mean smallest hop count&minimum hop&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +graph • shortest mean smallest hop count&graph • shortest mean smallest hop count&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +72 mingshen sun ( cuhk ) mapreduce & hadoop dijkstra&’s algorithm&依赖 +graph • shortest mean smallest hop count&minimum hop&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +source node&node&GENERALIZATION +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +graph • shortest mean smallest hop count&graph • shortest mean smallest hop count&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&shortest path&依赖 +72 mingshen sun ( cuhk ) mapreduce & hadoop dijkstra&’s algorithm&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +mingshen sun ( cuhk ) mapreduce & hadoop single-source shortest path&source node&依赖 +Dijkstra&algorithm& +graph • shortest mean smallest hop count&minimum hop&依赖 +graph • shortest mean smallest hop count&graph • shortest mean smallest hop count&依赖 +Figure 5.3&’s algorithm&AGGREGATION +GRAPH algorithm&) 8 13 10 1 n2 n4 8 9 10 1 n2 n4 8 9 10 1 n2 n4 0 5 7 5 2 3 9 7 4 6 n1 0 5 7 5 2 3 9 7 4 6 n1 0 5 7 5 2 3 9 7 4 6 n1 2 n3 n5 2 n3 n5 2 n3 n5&依赖 +GRAPH algorithm&indicate&依赖 +GRAPH algorithm&5 ∞ 2 7 1 n3 n5 5 7 2 7 1 n3 n5 (&依赖 +a ) – (&running&依赖 +a ) – (&algorithm&依赖 +a ) – (&running&依赖 +a ) – (&running&依赖 +a ) – (&algorithm&依赖 +a ) – (&algorithm&依赖 +running&algorithm&AGGREGATION +a ) – (&running&依赖 +a ) – (&algorithm&依赖 +78 mingshen sun ( cuhk ) mapreduce & hadoop bfs pseudo-code 79 mingshen sun ( cuhk ) mapreduce & hadoop stopping criterion •&adjacency list )&依赖 +many iteration¶llel bfs ( equal edge weight case )&依赖 +78 mingshen sun ( cuhk ) mapreduce & hadoop bfs pseudo-code 79 mingshen sun ( cuhk ) mapreduce & hadoop stopping criterion •&( n&依赖 +78 mingshen sun ( cuhk ) mapreduce & hadoop bfs pseudo-code 79 mingshen sun ( cuhk ) mapreduce & hadoop stopping criterion •&emit ( n&依赖 +driver program check&counter value&依赖 +driver program check&counter value&依赖 +driver program check&counter value&依赖 +many iteration¶llel bf&依赖 +amount&time&AGGREGATION +captures notion&page importance&AGGREGATION +random jump • n&graph 84 ↵ pr&依赖 +• One&thousand&AGGREGATION +total number&node&AGGREGATION +probability&random jump • n&AGGREGATION +thousand&feature&AGGREGATION +out-degree&t •&AGGREGATION +• c ( t )&t •&依赖 +random jump • n&node&依赖 +t •&•&GENERALIZATION diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt b/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt new file mode 100644 index 0000000..52ab29a --- /dev/null +++ b/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt @@ -0,0 +1,1407 @@ +MapReduce & Hadoop II +Mingshen Sun +The Chinese University of Hong Kong +mssun@cse.cuhk.edu.hk +Mingshen Sun (CUHK) MapReduce & Hadoop +Outline +• MapReduce Recap +• Design patterns +• in-mapper combing +• pairs and stripes +• order inversion +• value-to-key conversion +2 +Mingshen Sun (CUHK) MapReduce & Hadoop +MapReduce Recap +• Input and output: each a set of key/value pairs. +• Tow functions implemented by users. +• Map (k1, v1) -> list(k2, v2) +• takes an input key/value pair +• produces a set of intermediate key/value pairs +• Reduce (k2, list(v2)) -> list(k3, v3) +• takes a set of values for an intermediate key +• produces a set of output value +• MapReduce framework guarantees that all values associated with +the same key are brought together in the reducer +3 +Mingshen Sun (CUHK) MapReduce & Hadoop +MapReduce Recap +• Optional functions: +• Partition (k’, number of partitions) -> +partition for k’ +• dividing up the intermediate key space and assigning intermediate +key-value pairs to reducers +• often a simple hash of the key, e.g., hash(k’) mod n +• Combine (k2, list(v2)) -> list(k2’, v2’) +• mini-reducers that run in memory after the map phase +• used as an optimization to reduce network traffic +• will be discuss later +4 +Mingshen Sun (CUHK) MapReduce & Hadoop +MapReduce Recap +5 +30 CHAPTER 2. MAPREDUCE BASICS +A α B β C γ D δ E ε F ζ +mapper mapper mapper mapper +a 1 b 2 c 3 c 6 a 5 c 2 b 7 c 8 +combiner combiner combiner combiner +pp pp pp pp +a 1 b 2 c 9 a 5 c 2 b 7 c 8 +partitioner partitioner partitioner partitioner +Shuffle and Sort: aggregate values by keys +a 1 5 b 2 7 c 2 9 8 +p p p p +reducer reducer reducer +X 5 Y 7 Z 9 +Figure 2.4: Complete view of MapReduce, illustrating combiners and partitioners in addition +Mingshen Sun (CUHK) MapReduce & Hadoop +Goals +• Key question: MapReduce provides an elegant +programming model, but how should we recast a multitude +of algorithms into the MapReduce model? +• Goal of this lecture: provide a guide to MapReduce +algorithm design: +• design patterns, which form the building blocks of may problems +6 +Mingshen Sun (CUHK) MapReduce & Hadoop +Challenges +• MapReduce execution framework handles most complicated +details +• e.g., copy intermediate key-value pairs from mappers to reducers +grouped by key during the shuffle and sort stage +• Programmers have little control over MapReduce execution: +• Where a mapper or reducer runs +• When a mapper or reduce begins or finishes +• Which input key-value pairs are processed by a specific mapper +• Which intermediate key-value pairs are processed by a specific +reducer +7 +Mingshen Sun (CUHK) MapReduce & Hadoop +Challenges +• Things that programmers can control: +• Construct complex data structures as keys and +values to store and communicate partial results +• Execute user-specified initialization/termination code in a map or +reduce task +• Preserve state in both mappers and reducers across multiple input +or intermediate keys +• Control sort order of intermediate keys, and hence the order of how +a reducer processes keys +• Control partitioning of key space, and hence the set of keys +encountered by a reducer +8 +Mingshen Sun (CUHK) MapReduce & Hadoop +Challenges +• What we really want… +• No inherent bottlenecks as algorithms are applied to +increasingly large datasets +• linear scalability: an algorithm running on twice the amount of data +should take only twice as long +• an algorithm running on twice the number of nodes should only take +half as long +9 +Mingshen Sun (CUHK) MapReduce & Hadoop +Design Patterns +• Combiners and in-mapper combining +• aggregate map outputs to reduce data traffic being shuffled from +mappers to reducers +• Paris and stripes +• keep track of joint events +• Order inversion +• sort and control the sequence of computation +• Value-to-key conversion +• allow secondary sorting +10 +Mingshen Sun (CUHK) MapReduce & Hadoop +Local Aggregation +• In Hadoop, intermediate results (i.e., map outputs) are +written to local disk before being sent over the network +• network and disk latencies are expensive +• Local aggregation of intermediate results reduces the +number of key-value pairs that need to be shuffled from the +mappers to the reducers +• Default combiner: +• provided by the MapReduce framework +• aggregate map outputs with the same key +• acts like a mini-reducer +11 +Mingshen Sun (CUHK) MapReduce & Hadoop +Word Count: Baseline +• What is the number of records being shuffled? +• without combiners? +• with combiners? +12 +42 CHAPTER 3. MAPREDUCE ALGORITHM DESIGN +1: class Mapper +2: method Map(docid a, doc d) +3: for all term t 2 doc d do +4: Emit(term t, count 1) +1: class Reducer +2: method Reduce(term t, counts [c1, c2, . . .]) +3: sum 0 +4: for all count c 2 counts [c1, c2, . . .] do +5: sum sum + c +6: Emit(term t, count sum) +Figure 3.1: Pseudo-code for the basic word count algorithm in MapReduce (repeated from +Figure 2.3). +The first technique for local aggregation is the combiner, already discussed Section 2.4. Combiners provide a general mechanism within the MapReduce framework +to reduce the amount of intermediate data generated by the mappers—recall that they +can be understood as “mini-reducers” that process the output of mappers. In this +Mingshen Sun (CUHK) MapReduce & Hadoop +Implementation in Hadoop +public class WordCount { +} +13 +public static class TokenizerMapper +extends Mapper{ +private final static IntWritable one = new IntWritable(1); +private Text word = new Text(); +public void map(Object key, Text value, Context context +) throws IOException, InterruptedException { +StringTokenizer itr = new StringTokenizer(value.toString()); +while (itr.hasMoreTokens()) { +word.set(itr.nextToken()); +context.write(word, one); +} +} +} +Mingshen Sun (CUHK) MapReduce & Hadoop +Implementation in Hadoop +public class WordCount { +} +14 +public static class IntSumReducer +extends Reducer { +private IntWritable result = new IntWritable(); +public void reduce(Text key, Iterable values, +Context context +) throws IOException, InterruptedException { +int sum = 0; +for (IntWritable val : values) { +sum += val.get(); +} +result.set(sum); +context.write(key, result); +} +} +Mingshen Sun (CUHK) MapReduce & Hadoop +Implementation in Hadoop +public class WordCount { +} +15 +public static void main(String[] args) throws Exception { +Configuration conf = new Configuration(); +Job job = Job.getInstance(conf, "word count"); +job.setJarByClass(WordCount.class); +job.setMapperClass(TokenizerMapper.class); +job.setCombinerClass(IntSumReducer.class); +job.setReducerClass(IntSumReducer.class); +job.setOutputKeyClass(Text.class); +job.setOutputValueClass(IntWritable.class); +FileInputFormat.addInputPath(job, new Path(args[0])); +FileOutputFormat.setOutputPath(job, new Path(args[1])); +System.exit(job.waitForCompletion(true) ? 0 : 1); +} +Mingshen Sun (CUHK) MapReduce & Hadoop +Usage +• Environment +• Compile & Package +• Run +16 +export JAVA_HOME=/usr/java/default +export PATH=$JAVA_HOME/bin:$PATH +export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar +$ bin/hadoop com.sun.tools.javac.Main WordCount.java +$ jar cf wc.jar WordCount*.class +$ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/ +input /user/joe/wordcount/output +Mingshen Sun (CUHK) MapReduce & Hadoop +Word Count: Version 1 +• in-mapper combining +• emits a key-value pair for each unique term per document +17 +3.1. LOCAL AGGREGATION 1: class Mapper +2: method Map(docid a, doc d) +3: H new AssociativeArray +4: for all term t 2 doc d do +5: H{t} H{t} + 1 . Tally counts for entire document +6: for all term t 2 H do +7: Emit(term t, count H{t}) +Figure 3.2: Pseudo-code for the improved MapReduce word count algorithm that associative array to aggregate term counts on a per-document basis. Reducer is the same Figure 3.1. +This basic idea can be taken one step further, as illustrated in the variant word count algorithm in Figure 3.3 (once again, only the mapper is modified). workings of this algorithm critically depends on the details of how map and tasks in Hadoop are executed, discussed in Section 2.6. Recall, a (Java) mapper is created for each map task, which is responsible for processing a block of input counts for entire document +Mingshen Sun (CUHK) MapReduce & Hadoop +Word Count: Version 2 +• in-mapper combining +• recall a map object is created for each map task +• aggregate all data appearing in the input block processed by the +map task +18 +44 CHAPTER 3. MAPREDUCE ALGORITHM DESIGN +1: class Mapper +2: method Initialize +3: H new AssociativeArray +4: method Map(docid a, doc d) +5: for all term t 2 doc d do +6: H{t} H{t} + 1 . Tally counts across documents +7: method Close +8: for all term t 2 H do +9: Emit(term t, count H{t}) +Figure 3.3: Pseudo-code for the improved MapReduce word count algorithm that demonstrates +the “in-mapper combining” design pattern. Reducer is the same as in Figure 3.1. +For example, Hadoop makes no guarantees on how many times the combiner is applied, +or that it is even applied at all. The combiner is provided as a semantics-preserving +optimization to the execution framework, which has the option of using it, perhaps +multiple times, or not at all (or even in the reduce phase). In some cases (although in this particular example), such indeterminism is unacceptable, which is exactly counts across documents +Setup() in Java +Cleanup() in Java +Mingshen Sun (CUHK) MapReduce & Hadoop +Combiners v.s. In-Mapper Combiners +• Advantages of in-mapper combiners: +• Provide control over where and how local aggregation takes place. +In contrast, semantics of default combiners are underspecified in +MapReduce. +• In-mapper combiners are applied inside the code. Default +combiners are applied inside the map outputs (after being emitted +by the map task). +• Disadvantages: +• States are preserved within mappers -> potentially large memory +overhead. +• algorithmic behavior may depend on the order in which input keyvalue +pairs are encountered - > potential order-dependent bugs. +19 +Mingshen Sun (CUHK) MapReduce & Hadoop +Combiner Design +• Combiner and reducer must share the same signature +• combiner is treated as mini-reducer +• combiner input and output key-value types must match reducer +input key-value type +• Remember: combiner are optional optimizations +• with/without combiner should not affect algorithm correctness +• may be run 0, 1, or multiple times, determined by the MapReduce +execution framework +• In Java, you can specify the combiner class as: +• public void setCombinerClass(Class cls) +• exactly the Reducer type +20 +Mingshen Sun (CUHK) MapReduce & Hadoop +Computing the Mean: Version 1 +• Any drawback? +• Can we use reducer as combiner? +• i.e., set combiner class to be reducer class +21 +3.1. LOCAL AGGREGATION 47 +1: class Mapper +2: method Map(string t, integer r) +3: Emit(string t, integer r) +1: class Reducer +2: method Reduce(string t, integers [r1, r2, . . .]) +3: sum 0 +4: cnt 0 +5: for all integer r 2 integers [r1, r2, . . .] do +6: sum sum + r +7: cnt cnt + 1 +8: ravg sum/cnt +9: Emit(string t, integer ravg) +Figure 3.4: Pseudo-code for the basic MapReduce algorithm that computes the mean of values +associated with the same key. +of values associated with the same key, and the reducer would compute the mean of +those values. As a concrete example, we know that: +Mean(1, 2, 3, 4, 5) 6= Mean(Mean(1, 2),Mean(3, 4, 5)) +Pseudo-code for the basic +MapReduce algorithm that +computes the mean of +values associated with the +same key. +Mingshen Sun (CUHK) MapReduce & Hadoop +Computing the Mean: Version 1 +• Mean of the means is not the original mean. +• e.g., +• mean(1, 2, 3, 4, 5) != mean(mean(1, 2), mean(3, 4, 5)) +• It’s not a problem for Word Count problem, but it’s a +problem here. +22 +Mingshen Sun (CUHK) MapReduce & Hadoop +Computing the Mean: Version 2 +• Does it work? Why? +• recall that combiners must have the same input and output keyvalue +type +• Why? +• combiners are optimizations that cannot change the correctness of +the algorithm +23 +48 CHAPTER 3. MAPREDUCE ALGORITHM DESIGN +1: class Mapper +2: method Map(string t, integer r) +3: Emit(string t, integer r) +1: class Combiner +2: method Combine(string t, integers [r1, r2, . . .]) +3: sum 0 +4: cnt 0 +5: for all integer r 2 integers [r1, r2, . . .] do +6: sum sum + r +7: cnt cnt + 1 +8: Emit(string t, pair (sum, cnt)) . Separate sum and count +1: class Reducer +2: method Reduce(string t, pairs [(s1, c1), (s2, c2) . . .]) +3: sum 0 +4: cnt 0 +5: for all pair (s, c) 2 pairs [(s1, c1), (s2, c2) . . .] do +6: sum sum + s +7: cnt cnt + c +8: ravg sum/cnt +9: Emit(string t, integer ravg) +Figure 3.5: Pseudo-code for an incorrect first attempt at introducing combiners to compute +the mean of values associated with each key. The mismatch between combiner input and output +key-value types violates the MapReduce programming model. +3: sum 0 +4: cnt 0 +5: for all integer r 2 integers [r1, r2, . . .] do +6: sum sum + r +7: cnt cnt + 1 +8: Emit(string t, pair (sum, cnt)) . Separate 1: class Reducer +2: method Reduce(string t, pairs [(s1, c1), (s2, c2) . . .]) +3: sum 0 +4: cnt 0 +5: for all pair (s, c) 2 pairs [(s1, c1), (s2, c2) . . .] do +6: sum sum + s +7: cnt cnt + c +8: ravg sum/cnt +9: Emit(string t, integer ravg) +Figure 3.5: Pseudo-code for an incorrect first attempt at introducing the mean of values associated with each key. The mismatch between combiner key-value types violates the MapReduce programming model. +chapter. We will frequently encounter complex keys and values this book. +Unfortunately, this algorithm will not work. Recall that combiners same input and output key-value type, which also must be the output type and the reducer input type. This is clearly not the why this restriction is necessary in the programming model, remember are optimizations that cannot change the correctness of the algorithm. the combiner and see what happens: the output value type of so the reducer expects to receive a list of integers as values. But expects a list of pairs! The correctness of the algorithm is contingent running on the output of the mappers, and more specifically, that +Mingshen Sun (CUHK) MapReduce & Hadoop +Computing the Mean: Version 3 +• Does it work? Why? +24 +3.1. LOCAL AGGREGATION 49 +1: class Mapper +2: method Map(string t, integer r) +3: Emit(string t, pair (r, 1)) +1: class Combiner +2: method Combine(string t, pairs [(s1, c1), (s2, c2) . . .]) +3: sum 0 +4: cnt 0 +5: for all pair (s, c) 2 pairs [(s1, c1), (s2, c2) . . .] do +6: sum sum + s +7: cnt cnt + c +8: Emit(string t, pair (sum, cnt)) +1: class Reducer +2: method Reduce(string t, pairs [(s1, c1), (s2, c2) . . .]) +3: sum 0 +4: cnt 0 +5: for all pair (s, c) 2 pairs [(s1, c1), (s2, c2) . . .] do +6: sum sum + s +7: cnt cnt + c +8: ravg sum/cnt +9: Emit(string t, integer ravg) +Figure 3.6: Pseudo-code for a MapReduce algorithm that computes the mean of values associated +Mingshen Sun (CUHK) MapReduce & Hadoop +Computing the Mean: Version 4 +• Does it work? +• Do we need a combiner? +25 +50 CHAPTER 3. MAPREDUCE ALGORITHM DESIGN +1: class Mapper +2: method Initialize +3: S new AssociativeArray +4: C new AssociativeArray +5: method Map(string t, integer r) +6: S{t} S{t} + r +7: C{t} C{t} + 1 +8: method Close +9: for all term t 2 S do +10: Emit(term t, pair (S{t}, C{t})) +Figure 3.7: Pseudo-code for a MapReduce algorithm that computes the mean of values associated +with each key, illustrating the in-mapper combining design pattern. Only the mapper is +shown here; the reducer is the same as in Figure 3.6 +and one. The reducer would still arrive at the correct sum and count, and hence the +mean would be correct. Now add in the combiners: the algorithm would remain correct, +no matter how many times they run, since the combiners merely aggregate partial sums +and counts to pass along to the reducers. Note that although the output key-value type +of the combiner must be the same as the input key-value type of the reducer, the reducer +Mingshen Sun (CUHK) MapReduce & Hadoop +Pairs and Stripes +• To illustrate how constructing complex keys and values +improves the performance of computation. +26 +Mingshen Sun (CUHK) MapReduce & Hadoop +A New Running Example +• Problem: building a word co-occurrence matrix over a text +collection +• M = n * n matrix (n = number of unique words) +• m[i][j] = number of times word w[i] co-occurs with word w[j] within a +specific context (e.g., same sentence, same paragraph, same +document) +• it is easy to show that m[i][j] == m[j][i] +• Why this problem is interesting? +• distributional profiles of words +• information retrieval +• statistical natural language processing +27 +Mingshen Sun (CUHK) MapReduce & Hadoop +Challenge +• Space requirement: O(n^2). +• too big if we simply store the whole matrix with billions of words in +memory +• a single machine typically cannot keep the whole matrix +• How to use MapReduce to implement this large counting +problem? +• Our approach: +• mappers generate partial counts +• reducers aggregate partial counts +28 +Mingshen Sun (CUHK) MapReduce & Hadoop +Pairs +• Each mapper: +• Emits intermediate key-value pairs with each co-occurring word pair +and integer 1 +• Each reducer: +• Sums up all values associated with the same co-occurring word pair +• MapReduce execution framework guarantees that all values +associated with the same key are brought together in the reducer +29 +Mingshen Sun (CUHK) MapReduce & Hadoop +Pairs +• Can we use the default combiner here? +30 +3.2. PAIRS AND STRIPES 53 +1: class Mapper +2: method Map(docid a, doc d) +3: for all term w 2 doc d do +4: for all term u 2 Neighbors(w) do +5: Emit(pair (w, u), count 1) . Emit count for each co-occurrence +1: class Reducer +2: method Reduce(pair p, counts [c1, c2, . . .]) +3: s 0 +4: for all count c 2 counts [c1, c2, . . .] do +5: s s + c . Sum co-occurrence counts +6: Emit(pair p, count s) +Figure 3.8: Pseudo-code for the “pairs” approach for computing word co-occurrence matrices +from large corpora. +1: class Mapper +2: method Map(docid a, doc d) +Mingshen Sun (CUHK) MapReduce & Hadoop +Stripes +• Each mapper: +• For each particular word, stores co-occurrence information in an +associative array +• Emits intermediate key-value pairs with words as keys and +corresponding associative arrays as values +• Each reducer: +• Sums all the counts in the associative arrays +• MapReduce execution framework guarantees that all associative +arrays with the same key are brought together in the reducer +31 +Mingshen Sun (CUHK) MapReduce & Hadoop +Stripes +• Example: +• Each mapper emits +• a -> {b: count(b), c: count(c), d: count(d) …} +• Reducers perform element-wise sum of associative arrays +32 +(a, b) -> 1 +(a, c) -> 2 +(a, d) -> 5 +(a, e) -> 3 +(a, f) -> 2 +a -> {b: 1, c: 2, d: 5, e: 3, f: 2} +a -> {b: 1, , d: 5, e: 3 } ++ a -> {b: 1, c: 2, d: 2, f: 2} +———————————————————————————————————————— +a -> {b: 2, c: 2, d: 7, e: 3, f: 2} +Mingshen Sun (CUHK) MapReduce & Hadoop +Stripes +• pseudo-code of stripes approach +33 +1: class Mapper +2: method Map(docid a, doc d) +3: for all term w 2 doc d do +4: H new AssociativeArray +5: for all term u 2 Neighbors(w) do +6: H{u} H{u} + 1 . Tally words co-occurring with w +7: Emit(Term w, Stripe H) +1: class Reducer +2: method Reduce(term w, stripes [H1,H2,H3, . . .]) +3: Hf new AssociativeArray +4: for all stripe H 2 stripes [H1,H2,H3, . . .] do +5: Sum(Hf,H) . Element-wise sum +6: Emit(term w, stripe Hf ) +Figure 3.9: Pseudo-code for the “stripes” approach for computing word co-occurrence matrices +from large corpora. +Mingshen Sun (CUHK) MapReduce & Hadoop +Pairs v.s. Stripes +• Pairs: +• Pro: Easy to understand and implement +• Con: Generate many key-value pairs +• Stripes: +• Pro: Generate fewer key-value pairs +• Pro: Make better use of combiners +• Con: Memory size of associative arrays in mappers could be huge +• Both pairs and stripes can apply in-mapper combining +34 +Mingshen Sun (CUHK) MapReduce & Hadoop +Pairs v.s. Stripes +• stripes much faster than pairs +• linearity is maintained +35 +56 CHAPTER 3. MAPREDUCE ALGORITHM DESIGN +0 +500 +1000 +1500 +2000 +2500 +3000 +3500 +4000 +0 20 40 60 80 100 +Running time (seconds) +Percentage of the APW corpus +R2 = 0.992 +R2 = 0.999 +"stripes" approach +"pairs" approach +Figure 3.10: Running time of the “pairs” and “stripes” algorithms for computing word cooccurrence +matrices on di↵erent fractions of the APW corpus. These experiments were performed +on a Hadoop cluster with 19 slaves, each with two single-core processors and two disks. +5000 +Mingshen Sun (CUHK) MapReduce & Hadoop +Relative Frequencies +• Drawback of co-occurrence counts +• absolute counts doesn’t consider that some words appear more +frequently than others +• e.g., “is” occurs very often by itself +• doesn’t imply “is good” occurs more frequently than “Hello World” +• Estimate relative frequencies instead of counts +• How do we apply MapReduce to this problem? +36 +Relative Frequencies +Drawback of co-occurrence counts: +• Absolute counts doesn’t consider that some words +appear more frequently than others +• e.g., “is” occurs very often by itself. It doesn’t imply +“is good” occurs more frequently than “Hello World” +Estimate relative frequencies instead of counts: +How do we MapReduce to this problem? +31 +􀂦 +􀀠 􀀠 +' +count ( , ' ) +count ( , ) +count ( ) +count ( , ) +( | ) +B +A B +A B +A +A B +f B A +marginal +Mingshen Sun (CUHK) MapReduce & Hadoop +Relative Frequencies +• Computing relative frequencies with the stripes approach is +straightforward +• Sum all the counts in the associative array for each word +• Why is it possible in MapReduce? +• Drawback: assuming that each associative array fits into memory +• How to compute relative frequencies with the pairs +approach? +37 +Mingshen Sun (CUHK) MapReduce & Hadoop +Relative Frequencies with Pairs +• Mapper emits (a, *) for every word being observed +• Mapper makes sure same word goes to the same reducer +(use partitioner) +• Mapper makes suer (a, *) comes first, before individual +counts (how?) +• Reducer holds state to remember the count of (a, *), until all +pairs with the word “a” have been computed +38 +(a, *) -> 32 +(a, b1) -> 3 +(a, b2) -> 12 +(a, b3) -> 7 +(a, b4) -> 1 +… +reducer holds this value in +memory +(a, b1) -> 3/32 +(a, b2) -> 12/32 +(a, b3) -> 7/32 +(a, b4) -> 1/32 +… +Mingshen Sun (CUHK) MapReduce & Hadoop +Order Inversion +• Why order inversion? +• Computing relative frequencies requires marginal counts +• But marginal cannot be computed until you see all counts +• Buffering is a bad idea! +• Trick: getting the marginal counts to arrive at the reducer before the +joint counts +• MapReduce allows you to define the order of keys being +processed by the reducer +• shuffle and sort +39 +Mingshen Sun (CUHK) MapReduce & Hadoop +Order Inversion: Idea +• How to use the design pattern of order inversion to compute +relative frequencies via the pair approach? +• Emit a special key-value pair for each co-occurring word for the +computation of marginal +• Control the sort order of the intermediate key so that the marginal +count comes before individual counts +• Define a custom partitioner to ensure all pairs with the same left +word are shuffled to the same reducer +• Preserve state in reducer to remember the marginal count for each +word +40 +Mingshen Sun (CUHK) MapReduce & Hadoop +Secondary Sorting +• MapReduce sorts input to reducers by key +• values may be arbitrarily ordered +• What if want to sort value also? +• Scenario: +• sensors record temperature over time +• each sensor emits (id, time t, temperature v) +41 +Mingshen Sun (CUHK) MapReduce & Hadoop +Secondary Sorting +• Naive solution +• each sensor emits +• id -> (t, v) +• all readings of sensor id will be aggregated into a reducer +• buffer values in memory for all id, then sort +• Why is this a bad idea? +42 +Mingshen Sun (CUHK) MapReduce & Hadoop +Secondary Sorting +• Value-to-key conversion +• each mapper emits +• (id, t) -> v +• let execution framework do the sorting +• preserve state across multiple key-value pairs to handle processing +• anything else? +• Main idea: sorting is offloaded from the reducer (in naive +approach) to the MapReduce framework +43 +Mingshen Sun (CUHK) MapReduce & Hadoop +Tools for Synchronization +• Cleverly-constructed data structures +• Bring data together +• Sort order of intermediate keys +• Control order in which reducers process keys +• Partitioner +• Control which reducer processes which keys +• Preserving state in mappers and reducers +• Capture dependencies across multiple keys and values +44 +Mingshen Sun (CUHK) MapReduce & Hadoop +Issues and Tradeoffs +• Number of key-value pairs +• Object creation overhead +• Time for sorting and shuffling pairs across the network +• Size of each key-value pair +• De/serialization overhead +• Local aggregation +• Opportunities to perform local aggregation varies +• Combiners make a big difference +• Combiners vs. in-mapper combining +• RAM vs. disk vs. network +45 +Mingshen Sun (CUHK) MapReduce & Hadoop +Debugging at Scale +• Works on small datasets, won’t scale... why? +• Memory management issues (buffering and object +creation) +• Too much intermediate data +• Mangled input records +• Real-world data is messy! +• Word count: how many unique words in Wikipedia? +• There’s no such thing as “consistent data” +• Watch out for corner cases +• Isolate unexpected behavior, bring local +46 +Mingshen Sun (CUHK) MapReduce & Hadoop +Summary +• Design patterns +• in-mapper combing +• pairs and stripes +• order inversion +• value-to-key conversion +47 +Mingshen Sun (CUHK) MapReduce & Hadoop +MapReduce Application +• Text retrieval +• inverted indexing +• Data mining +• TF-IDF +• Graph algorithm +• parallel breadth-first search +• parallel dijkstra’s algorithm +• PageRank +48 +Mingshen Sun (CUHK) MapReduce & Hadoop +Web Search Problem +• Web search is to retrieve relevant web objects +• e.g., web pages, PDFs, PPT slides +• Web search problem +• crawling: gathering web content +• indexing: constructing search indexing structure +• retrieval: ranking documents given a query +• Challenge +• the web is huge +• billions of web objects, terabytes of information +• Performance goals +• query latency needs to be small +• scalable for a large number of documents +49 +Mingshen Sun (CUHK) MapReduce & Hadoop +Inverted Indexes +• Inverted Index +• A data structure that given a term provides access to the list of +documents that contain the term +• Used by most full-text search engines today +• By documents, we mean web objects +• Retrieval engine uses the inverted index to score documents +that contain the query terms based on some ranking model +• e.g., based on term matches, term proximity, term attributes, etc. +50 +Mingshen Sun (CUHK) MapReduce & Hadoop +Inverted Indexes +• Simple illustration of an inverted index. +• Each term is associated with a list of postings. +• Each posting is comprised of a document id and a payload, denoted +by p in this case. +• An inverted index provides quick access to documents ids that +contain a term. +51 +74 CHAPTER 4. INVERTED INDEXING FOR TEXT RETRIEVAL +terms postings +term1 +term2 +term3 +d1 p d5 p d6 p d11 p +d11 p d23 p d59 p d84 p +3 d1 p d4 p d11 p d19 p +1 4 11 19 Figure 4.1: Simple illustration of an inverted index. Each term is associated with a list postings. Each posting is comprised of a document id and a payload, denoted by p in this case. +An inverted index provides quick access to documents ids that contain a term. +the front of a postings list. Either way, an auxiliary data structure is necessary maintain the mapping from integer document ids to some other more meaningful handle, +such as a URL. +Given a query, retrieval involves fetching postings lists associated with query terms +and traversing the postings to compute the result set. In the simplest case, boolean +Mingshen Sun (CUHK) MapReduce & Hadoop +Inverted Indexes +• Given a query, retrieval involves fetching postings lists +associated with query terms and traversing the postings to +compute the result set. +• Simple Boolean retrieval: +• Apply union (OR) or intersection (AND) of posting lists +• General retrieval: +• Document scores are ranked +• Top k documents are returned +52 +Mingshen Sun (CUHK) MapReduce & Hadoop +Inverted Indexes +53 +one$fish,$two$fish +Doc$1 +red$fish,$blue$fish +Doc$2 +cat$in$the$hat +Doc$3 +1 +1 +1 +1 +1 +1 +1 2 3 +1 +1 +1 +4 +blue +cat +egg +fish +green +ham +hat +one +3 +4 +1 +4 +4 +3 +2 +1 +blue +cat +egg +fish +green +ham +hat +one +2 +green$eggs$and$ham +Doc$4 +red 1 +two 1 +red 2 +two 1 +Mingshen Sun (CUHK) MapReduce & Hadoop +Inverted Indexes: Construction +• How to construct an inverted index? +• Naive approach: +• For each document, extract all useful terms, and exclude all +stopwords (e.g., “the”, “a”, “of”) and remove affixes (e.g., “dogs” to +“dog”) +• For each term, add the posting (document, payload) to an existing +list, or create a posting list if the term is new +• Clearly, naive approach is not scalable if the document +collection is huge and each document is large +• Can we use MapReduce? +54 +Mingshen Sun (CUHK) MapReduce & Hadoop +Baseline Implementation +• Our goal: construct an inverted index given a document +collection +• Main idea: +• Input to each mapper: +• Document IDs (keys) +• Actual document content (values) +• What each mapper does: +• Analyze each document and extract useful terms +• Compute term frequencies (per document) +• Emit (term, posting) +• What each reducer does +• Aggregates all observed postings for each term +• Construct the posting list +55 +Mingshen Sun (CUHK) MapReduce & Hadoop +Baseline Implementation +56 +4.5. INDEX COMPRESSION 79 +1: class Mapper +2: method Map(docid n, doc d) +3: H new AssociativeArray +4: for all term t 2 doc d do +5: H{t} H{t} + 1 +6: for all term t 2 H do +7: Emit(tuple ht, ni, tf H{t}) +1: class Reducer +2: method Initialize +3: tprev ; +4: P new PostingsList +5: method Reduce(tuple ht, ni, tf [f]) +6: if t 6= tprev ^ tprev 6= ; then +7: Emit(term t, postings P) +8: P.Reset() +9: P.Add(hn, fi) +10: tprev t +11: method Close +12: Emit(term t, postings P) +Mingshen Sun (CUHK) MapReduce & Hadoop +Baseline Implementation +57 +4.4. INVERTED INDEXING: REVISED IMPLEMENTATION 77 +one fish, two fish +doc 1 +red fish, blue fish +doc 2 +one red bird +doc 3 +mapper mapper mapper +fish d1 2 +one d1 1 +two d1 1 +blue d2 1 +fish d2 2 +red d2 1 +bird d3 1 +one d3 1 +red d3 1 +reducer +Shuffle and Sort: aggregate values by keys +reducer fish d1 2 d2 2 bird d3 1 +one d1 1 +two d1 1 +blue d2 1 +red d2 1 d3 1 +d3 1 +Simple illustration of the baseline inverted indexing algorithm in MapReduce with +Mingshen Sun (CUHK) MapReduce & Hadoop +Baseline Implementation +• In the shuffle and sort phase, MapReduce framework forms +a large, distributed group by the postings of each term +• From reducer’s point of view +• Each input to the reducer is the resulting posting list of a term +• Reducer may sort the list (if needed), and writes the final output to +disk +• The task of each reducer is greatly simplified! MapReduce +framework has done most heavy liftings. +58 +Mingshen Sun (CUHK) MapReduce & Hadoop +Positional Indexes +59 +1 +1 +2 +1 +1 +2 2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +one 1 +two 1 +fish 1 +one fish, two fish +Doc 1 +red 2 +blue 2 +fish 2 +red fish, blue fish +Doc 2 +cat 3 +hat 3 +cat in the hat +Doc 3 +fish 1 2 +one 1 +two 1 +red 2 +cat 3 +blue 2 +hat 3 +Shuffle and Sort: aggregate values by keys +Map +Reduce +Mingshen Sun (CUHK) MapReduce & Hadoop +Scalability Issue +• Scalability problem in baseline implementation +60 +4.3. INVERTED INDEXING: BASELINE IMPLEMENTATION 1: class Mapper +2: procedure Map(docid n, doc d) +3: H new AssociativeArray +4: for all term t 2 doc d do +5: H{t} H{t} + 1 +6: for all term t 2 H do +7: Emit(term t, posting hn,H{t}i) +1: class Reducer +2: procedure Reduce(term t, postings [hn1, f1i, hn2, f2i . . .]) +3: P new List +4: for all posting ha, fi 2 postings [hn1, f1i, hn2, f2i . . .] do +5: Append(P, ha, fi) +6: Sort(P) +7: Emit(term t, postings P) +Figure 4.2: Pseudo-code of the baseline inverted indexing algorithm in MapReduce. Any problem? +Mingshen Sun (CUHK) MapReduce & Hadoop +Scalability Issue +• Assumption of baseline implementation: +• Reducer has sufficient memory to hold all postings associated with +the same term +• Why? +• The MapReduce framework makes no guarantees about the +ordering of values associated with the same key. +• The reducer first buffers all postings (line 5) and then performs an +in-memory sort before writing the postings to disk +61 +Mingshen Sun (CUHK) MapReduce & Hadoop +Scalability Issue +• How to solve? Key idea is to let MapReduce framework do +sorting for us +• Instead of emitting +• (term t, posting ) +• Emit +• (tuple , f) +• Value-to-key conversion!! +62 +Mingshen Sun (CUHK) MapReduce & Hadoop +Revised Implementation +• With value-to-key conversion, the MapReduce framework +ensures the postings arrive in sorted order (based on ) +• Results can be written to disk directly +• Caution: you need a customized partitioner to ensure that all +tuples with the same term are shuffled to the same reducer +63 +Mingshen Sun (CUHK) MapReduce & Hadoop +Revised Implementation +64 +4.5. INDEX COMPRESSION 79 +1: class Mapper +2: method Map(docid n, doc d) +3: H new AssociativeArray +4: for all term t 2 doc d do +5: H{t} H{t} + 1 +6: for all term t 2 H do +7: Emit(tuple ht, ni, tf H{t}) +1: class Reducer +2: method Initialize +3: tprev ; +4: P new PostingsList +5: method Reduce(tuple ht, ni, tf [f]) +6: if t 6= tprev ^ tprev 6= ; then +7: Emit(term t, postings P) +8: P.Reset() +9: P.Add(hn, fi) +10: tprev t +11: method Close +12: Emit(term t, postings P) +Figure 4.4: Pseudo-code of a scalable inverted indexing algorithm in MapReduce. By applying +results are directly written to +disk +Mingshen Sun (CUHK) MapReduce & Hadoop +TF-IDF +• Term Frequency – Inverse Document Frequency (TF-IDF) +• Answers the question “How important is this term in a document” +• Known as a term weighting function +• Assigns a score (weight) to each term (word) in a document +• Very commonly used in text processing and search +• Has many applications in data mining +65 +Mingshen Sun (CUHK) MapReduce & Hadoop +TF-IDF Motivation +• Merely counting the number of occurrences of a word in a +document is not a good enough measure of its relevance +• If the word appears in many other documents, it is probably less +relevance +• Some words appear too frequently in all documents to be relevant +• Known as ‘stopwords’ +• TF-IDF considers both the frequency of a word in a given +document and the number of documents which contain the +word +66 +Mingshen Sun (CUHK) MapReduce & Hadoop +TF-IDF: Definition +• Term Frequency (TF) +• Number of times a term appears in a +• document (i.e., the count) +• Inverse Document Frequency (IDF) +• N: total number of documents +• n: number of documents that contain a term +• TF-IDF +• TF × IDF +67 +idf = log ( +N +n +) +Mingshen Sun (CUHK) MapReduce & Hadoop +Computing TF-IDF With MapReduce +• Overview of algorithm: 3 MapReduce jobs +• Job 1: compute term frequencies +• Job 2: compute number of documents each word +occurs in +• Job 3: compute TD-IDF +68 +Mingshen Sun (CUHK) MapReduce & Hadoop +Graph: Real-World Problems +• Finding shortest paths +• Routing Internet traffic and UPS trucks +• Finding minimum spanning trees +• Telco laying down fiber +• Finding Max Flow +• Airline scheduling +• Identify “special” nodes and communities +• Breaking up terrorist cells, spread of avian flu +• Bipartite matching +• Monster.com, Match.com +• PageRank +69 +Mingshen Sun (CUHK) MapReduce & Hadoop +Graphs and MapReduce +• Graph algorithms typically involve: +• Performing computations at each node: based on +node features, edge features, and local link structure +• Propagating computations: “traversing” the graph +• Challenge: +• Algorithms running on a single machine and putting +the entire graph in memory are not scalable +• Key questions: +• How do you represent graph data in MapReduce? +• How do you traverse a graph in MapReduce? +70 +Mingshen Sun (CUHK) MapReduce & Hadoop +Graph Representations +• Two common representations +• adjacency matrix +• adjacency list +71 +5.1. GRAPH REPRESENTATIONS n1 +n2 +n1 n2 n3 n4 n5 +n1 0 1 0 1 0 +n2 0 0 1 0 1 +n1 [n2, n4] +n2 [n3, n5] +n3 +n5 +n3 0 0 0 1 0 +n4 0 0 0 0 1 +n5 1 1 1 0 0 +n3 [n4] +n4 [n5] +n5 [n1, n2, n3] +n4 adjacency matrix adjacency lists +Figure 5.1: A simple directed graph (left) represented as an adjacency matrix (middle) and +adjacency lists (right). +parallel breadth-first search (Section 5.2) and PageRank (Section 5.3). Before concluding +• easy to manipulate with linear algebra +• easy algorithmic implementation +• large memory space, esp. for sparse +graph +• much more compact representation +• easy to compute over out-links +• much more difficult to compute over +in-links +• How ever, the shuffle and sort +mechanism in MapReduce provides +an easy way to group edges by +destination nodes. +Mingshen Sun (CUHK) MapReduce & Hadoop +Single-Source Shortest Path +• Problem: find shortest paths from a source node to all other +nodes in the graph +• Shortest mean smallest hop counts or lowest weights +• Algorithm: +• Breadth-first-search: for finding minimum hop counts +• Dijkstra’s algorithm: for finding minimum-cost paths for general +graphs +72 +Mingshen Sun (CUHK) MapReduce & Hadoop +Dijkstra’s Algorithm +73 +96 CHAPTER 5. GRAPH ALGORITHMS +∞ 1 ∞ +n2 n4 +10 1 ∞ +n2 n4 +8 1 14 +n2 n4 +0 +10 +5 +2 3 +9 +4 6 +n1 +0 +10 +5 +2 3 +9 +4 6 +n1 +0 +10 +5 +2 3 +9 +4 6 +n1 +∞ ∞ +2 +7 1 +n3 n5 +5 ∞ +2 +7 1 +n3 n5 +5 7 +2 +7 1 +n3 n5 +(a) (b) (c) +8 13 +10 +1 +n2 n4 +8 9 +10 +1 +n2 n4 +8 9 +10 +1 +n2 n4 +0 +5 7 +5 +2 3 +9 +7 +4 6 +n1 +0 +5 7 +5 +2 3 +9 +7 +4 6 +n1 +0 +5 7 +5 +2 3 +9 +7 +4 6 +n1 +2 +n3 n5 +2 +n3 n5 +2 +n3 n5 +(d) (e) (f) +Figure 5.3: Example of Dijkstra’s algorithm applied to a simple graph with five nodes, with n1 +as the source and edge distances as indicated. Parts (a)–(e) show the running of the algorithm +at each iteration, with the current distance inside the node. Nodes with thicker borders are +those being expanded; nodes that have already been expanded are shown in black. +Mingshen Sun (CUHK) MapReduce & Hadoop +Dijkstra’s Algorithm +• Dijkstra’s algorithm is designed as a sequential algorithm +• Key to Dijkstra’s algorithm +• Priority queue that maintains a globally sorted list of nodes by +current distance +• Not possible in MapReduce, which doesn’t provide a mechanism for +exchanging global data +• Solution: +• Brute-force approach: parallel breadth first search +• Brute force: Try to revisit many nodes that have been visited +74 +Mingshen Sun (CUHK) MapReduce & Hadoop +Parallel BFS +• Consider simple case of equal edge weights +• Solution to the problem can be defined inductively +• Here’s the intuition: +• Define: b is reachable from a if b is on adjacency list of a +• DistanceTo(s) = 0 +• For all nodes p reachable from s, DistanceTo(p) = 1 +• For all nodes n reachable from some other set of nodes M, +DistanceTo(n) = 1 + min(DistanceTo(m), m \in M) +75 +s +m3 +m2 +m1 +n +… +… +… +d1 +d2 +d3 +Mingshen Sun (CUHK) MapReduce & Hadoop +Visualizing Parallel BFS +76 +n0 +n3 n2 +n1 +n7 +n6 +n5 +n4 +n9 +n8 +Mingshen Sun (CUHK) MapReduce & Hadoop +From Intuition to Algorithm +• Data representation: +• Key: node n +• Value: d (distance from start), adjacency list (nodes reachable from +n) +• Initialization: for all nodes except for start node, d = infinity +• Mapper: +• exit m in adjacency list: emit (m, d + 1) +• Sort/Shuffle +• Groups distances by reachable nodes +• Reducer: +• Selects minimum distance path for each reachable node +• Additional bookkeeping needed to keep track of actual path +77 +Mingshen Sun (CUHK) MapReduce & Hadoop +Multiple Iterations Needed +• Each MapReduce iteration advances the “frontier” by one +hop +• Subsequent iterations include more and more reachable nodes as +frontier expands +• Multiple iterations are needed to explore entire graph +• Preserving graph structure: +• Problem: Where did the adjacency list go? +• Solution: mapper emits (n, adjacency list) as well +78 +Mingshen Sun (CUHK) MapReduce & Hadoop +BFS Pseudo-Code +79 +Mingshen Sun (CUHK) MapReduce & Hadoop +Stopping Criterion +• How many iterations are needed in parallel BFS (equal edge +weight case)? +• Convince yourself: when a node is first “discovered”, we’ve +found the shortest path +• In practice, we iterate the algorithm until all node distances +are found (i.e., no more infinity) +• How? +• Maintain a counter inside the MapReduce program (i.e., count how +many node distances are found) +• Require a non-MapReduce driver program to submit a MapReduce +job to iterate the algorithm +• The driver program checks the counter value before submitting +another job +80 +Mingshen Sun (CUHK) MapReduce & Hadoop +Extend to General Weights +• Difference? +• How many iterations are needed in parallel BFS? +• How do we know that all shortest path distances are found? +81 +Mingshen Sun (CUHK) MapReduce & Hadoop +Other Graph Algorithms +• PageRank +• Subgraph pattern matching +• Computing simple graph statistics +• Degree vertex distributions +• Computing more complex graph statics +• Clustering coefficient +• Counting triangles +82 +Mingshen Sun (CUHK) MapReduce & Hadoop +Random Walks Over the Web +• Random surfer model: +• User starts at a random Web page +• User randomly clicks on links, surfing from page to page +• PageRank +• Characterizes the amount of time spent on any given page +• Mathematically, a probability distribution over pages +• PageRank captures notions of page importance +• Correspondence to human intuition? +• One of thousands of features used in web search (queryindependent) +83 +Mingshen Sun (CUHK) MapReduce & Hadoop +PageRank: Definition +• Given page x with inlinks t1…tn, where +• C(t) is the out-degree of t +• is probability of random jump +• N is the total number of nodes in the graph +84 +↵ +PR(x) = ↵ +✓ +1 +N +◆ ++ (1 \ No newline at end of file diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt.xml.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/mapreduce_hadoop2.txt.xml.xls new file mode 100644 index 0000000000000000000000000000000000000000..a58c00c287c619eed922f553c0dccdd2a00a4251 GIT binary patch literal 94720 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/sd/Fig1SeqDiagram.jfif b/src/main/resources/sdtocode/sd/Fig1SeqDiagram.jfif new file mode 100644 index 0000000000000000000000000000000000000000..a234ace3796dcfeb71e5a3418ad55c6c55ce82d5 GIT binary patch literal 52838 zcmeFZ1z1+g+Bd#v1O!341r#KuyF^MPl`bji?tBOVX@Lz$gOo~1cXuNx-5?#(@jTyR z$2scR=j?snbKdWN{jYC7TnlC%X3flf&#amI{@uS>u+Ol0;MQXaX$b%h4i0z@{s6Fr zTRY+|rY`_MRu-TK000$0gyRR`!4w9Vc^qg8AcAQ)Fs+i5eEk<71b|!p8>9dV_#IdV z5CSiNbOZc_dY$^~^Opwx(!gID_)7zSY2Ysn{J*FHB~t@)N*O&jOFb(9Kzfbvvo(PW zS`C@65&xF1jEej@jlj(f08vqYPygMrKz(zqy}vAr{}<=bUo!utfxk5Hmj?dQz+W2p zy9U@Eu(I+!;O1j{K*`3&$HB(;-~sS^-vNLUUz`#{!4%*e!4%FWK`shiw012=O6UPD@8p_^y|E_^PQHkL*XdXz4f7FPCrE`n4) z*Ukr~ufJxY5)!a8e8H#mNaEKLU`~+g*Sk9SstsNZ%sT>_m4f$T^z2MY0G~{H`*JC$i zVr4bdW70EZXJs;EXE)^LWaVLd!KzR7Yx9N%e{0>w(az%Mwhawfj4X^SjjSB(L2aHk)npo;$1=p;4`@HyS3df%|A7={m(|*!c^!RbNUw{!S8-afVG2D@5YTA z0xaJ){EwRW`5SQNf%pAwo`QE${$Kd~)yTi4Mq@V21W*AN)~n&dNx{m2Kwtt;80Le(QcsOqNC%|lM<5B z|Jxr}BY=$xca8u&RW)@D14E-1#wMm__709t&MvNQ zelPt40$&9MM@9b>6C3v?KH+UfW>$92yZ0Z8OG?YiD=Mq1n_F7j+B-VCx`&2GM#siK zPfRW>E-kODu6<789LAl@&5fKnkuH}M*cLpy6 zY(%6xtjIW`iYR)vx2f2CP;nndrWZBcpk`Ov!_&9>goaPUv2b_)TC|@f`*VW%{*NU4 zn_z#JYZAaffCC2)0UHno&Lx8B(%}EP{$m|r-cfj^8Iu`Q$fFtYpdDC&Xzsc zVRoMfX*~7VUjYWZgaINjASEFXidN8YIzupb@a&M~0)9jHT&TVJF|Y~)7K8_d*Rs=L zfNyRglw0zW_8jH%a71`d*%1b`Z)U#r=508YKg2p)e+QZWun7agKEZ$+P#+i|$cc4{ zrw!S!UZ+dLw1(ckLV&uNQJm6O!+<3RNHZi2G9W7k1CUg8FRiK{(;+1OLvJYdQom4q z9R|DEq&yA-ND88Y|3^IqDYJ5D!~14p|GXis^z8H4Ol%e6r>4}t#Y)sX=Xz`!QK5q_Pt%Gbh{r6 z&{2c|^y~kdLj4&vI~vRF2ZVgsxUXkw%TpDp9!Xo0K(^pEUk%u%_?B-bj=_Ls_q~Rz zIvDUJU4-l|uA&Iix0mt8`Eg8I3u*OOy0v~(ednYr{H}#D!nltHUf<^20pF=Av_=cO zHy{lGickAe_=~|X4A|Yv_%`#~py|7aK?4MZp)deVc;TDOFSFync6WZy&4&ZZAA?V1 ztAaPi6rR{WYKr-2V2EM&IMm;nau5k7=%+A}g zlAA;+gVjYWGhbs0-at9vl>b(y3^^DOl~@P^KC{cifKPGCLkcL|FaZ5_GsPk6It(~D z1&9BeoT{`qU=P_V61W2c#K==&0K}i-yPU&M|8@m;PDAEb5G#T>RuG~zY=BGitODyr z;mfE2Jg{5%Utz!_LBQcBMR5T4o6GK_ORo9|`Fd$8Mp<7e!BdT(lyjb*QY8)xr^wgb z_uFKzDi$HXtL>ofQ{urhNc7%Gri~0KF`*ldfM7GT#Q%0so~7A+a7D=bUuNX97?KpN=`1tMWHgbnXltCR4Q! zZD@YBqJ2?aWumM?eXEf^qU)+4fc|uYx!|7(J@DQ4%qLjqD@b8X;z#D2116>x{)i(%Oi&O&o7?# z4{J?Q2&qpHC0<$KVzB^l!wBWFVLI{zI(>IO?ro3Y4^M@-=I!)l_3|Jt#CRM{PS3B= zix812AWxl!sMd|F6b(9rxZW)Zrmeg1TnOxTC9rvEA=!h}M4Q&xZr?g4#5rVj=v-eJ zxs8F}U{)RQ=x+W9e}=IM<-(F}yVtgz)3FZir(j4k>%zqar6pBal6IH5?W(Ix5e;E7 z>%G|F!Xq6op~{8^6QrEhY49~IjF)V;>J`e+Gd5QOQr+HUaa2GRz}!hp%{{^Nla81VKCkyMTwp$xTsh-bDMuYE#7LYku`AW76WD9Fy^}Evw}eo@IA+Dh65>(s#_rP*+4e>KuVppFx3#)tVZj z3savxF5JH`J8`B-T&N7qYTW3E#fy|8;w9>r?gN}9+pBM>P3#zpJE)@zCUsLw=zloC zNv%%Jr5*osR~B;gOBdmH`3;Cwwl+IjFj~$ zvl#7Jw3d~s411=j_fIJlA+rtZ5e87Ms5vZ!J6Pm9P6<99+j7xVgp|zcXj^h~`Po+L zPuZ{8RtUOZD4?XN&uVVq-=@OQ)d`Jvm^=w3c+P8M*lQIs-b#>^K-@^%P!T3KtRCG z?BXmtVq{JamDOu5F*l#VaM84zb^Psh#`hRux7fT5o>FQDtFg`F+?cM<;7QPJs!QPd3_ZncInT)T9`sX0?lxv35fhw-@mKC)iy$sP>s-Lf~b?4ADQuO6dx z0x59ww+B@zXamc7@_9LGb}`MA*30*&?`BGKzLh3O$g48``pWXd7QqUcYaelJ(4wp* zO`Q7P$atKDi*cw_dG<8nr{S9flWdK7VV5ESO(>xXC^@F*{^jrW5EF~Es99o`klce>9fu3FawyL@UgG!BfmhnMK7ftKV{b3N{6_V;$~RXm7xg( zB6pi%!0`#VM)?2ZcKU-AR1j5F=MI(BMS}t3=BZb=M&O22shyXYBxa6!-W;mE80O&j z!|Tm;d$g5{^LVF-@HmO#aP~&iaY1$MfO5&$(ujvxPLsiVnaoXYj1wV=8Qy z-me1S-#4)?8}5scmAIrzYfD?m_PB0sl0Ra@#q6q6sGmvie*G{yIYtqdL5AiIq+=6(fv8lJ4_!yQS zrFyCq>bU|LI+g51N$nU0IQy6_?Zw9|Rt5#ck@_PbkHkWnWQN}cT_De-Ko!Q1uo?8rPFHIppjSq4u&LUPGR^w|>J*00%9V>nHIK}B4jQUi-;8q`DGR-zMo(Iz`5F@_6MI8|Nx+L@ zpLigx2^XhW)C&KI+CM|PW#CMTxffH8`@tG-8s@ryURq}yCMWK*idVh;Up5K}Ewh$r z^u_y;pHkCcE^%(vT4&FAR%PCP6gv(B^!+`8G)$+(Nb_GgStD9Mm%zG_5*SW#!Jrf; zUs6&t#JNsAwAEIS^y#x^hGe-^GP(R=6b)q)AtfTB)q14=2*-?!vQyOv2bqR>dp)-+ zbRbBt$(QG`1%Y0*1PTB7aU0;4l{`~-m89zQlxFZr`cfpO7{csFFKQUj#kj9~; zC^k}$7Pyr{SWyJ+uPwrFxHna~Bz8xbo$UiZkXbaJI*>2EPXU!S4u%0+=&s=EMDES^ znC`7N+BX+(0|KNI9|k~MG~%GKGBW!pO0`1*aJjncC5i6u^m^^yA-3(o*53Az1C1^)T8Vy@#CbMt5dp(fULHR^ek{ZP(Ep^zzO6 zkow=9mz5?MRy?lQ#$dvY?81RtrJ|dhb#{EwZJV?hB1~xJmbD$M`MJsJeQsIUyy-H@ zYYn0%?R^G^=dS48-ZxaH@3-y20F8j5)oHV8+z>n5$6rmk?K&TpufR*xGd`FO#rEr5 zO(pOtJAH;Y<{%JK?t8&w41JHyJ!ER=11SqWnHIrjmkCAp%)eu;-%hj$t( z8I|{y_Fsc)=@fT~hku`+yDa5pS96e4iKeU}NX2;$Cmb z%oMu%G9Thu6lI%l>S2HDGI>T(8hTDU0cc##eGbW-A~P7czmhn1z~%Z-7HS+*Q_r=v zx$SFX;dNL0vnih;!MSC7h8xGGd*XNyjq$yQjW5*}jTpID&*I^hPzsnK%{L0KQoErO zpSWGymj<9cwO=orYq(t-tmcv%SZ3Ed9!m?r{DW%8{&1WFmaDLU90^ zCHxeKI;OF#>ZbMVznj7!bx))L#+Ko-Rl6eaC-iHDIL6!DybC(fb z;3HJgaD@w6=`VFvVLOz0WX4wGrmDxH2iO$|-LSLJIUqOy-_Kcd;F78Jf>*UU7 zzGPBgOb}iKUn8Gn;AZf}5yU#tz(g1b>7ed_Vgx?0vpNt82b%5sA3&t3K+l7BQItJyzivI$r%2rY9rZYE&sv4vDTtT- z(2N2IK!R9NI0&U4@@-I@B7rMy`@4T=1soxJF93WNM1?o6&C|zO;LHKdgg|W&Qw8!N zr=zAW5D8g?Malrd?&wl?l5VJ7QfCfRwcqJ_Qu{KdToA=w&X)x)eeiD^kzz zeEA36DLV=yn@zSyx@Mb^vyK>+*7=j(z0a38kRB&k$2i*o$ zZV(LH1;IgP@aZ~P24~VYx$6P9fa{}y$lv!_Uh{AzjXLF90jp)# zTu?9s9sBTV`o4YS!Ylu`J?~tFAhG+|eN*=J;&PRO+{Sxk2`=Z9P|Xr0hj*cBKAWbSu%vaYdl@M}S-;UrMd6)?!9oR5%6@`d^N@VO+UOM`#Te98P4JC@pZs;~Ez74yI*^$4FqbAGnC`!OWTSC5bW8RD3_H@kO zzFr_)+JnpvtTsL$oN$ow4sE>e(D2`O%OC$5tFOZkw-U!@-($3n!e!lVA7Fg2nPOja zm{0tB)8gG9J|cPBC{o1av19rM54gDrNV>OSfF^rSsNvyU=t;Y|MAaMudqaR$cW>WS z);o-%uEyF#iflTBw}0>?!iSeT>@QqB+H{AMi03t!&m_6>V_q($)}$njb{?OZuUt*v zY6b7PxADI@EI7bxoFN8chG{kFq!m%@NF;a9?YvbHdw^%Llh#9hgxfHqkp1+@FO zow?p=l>*JhSN!OJO8(O_%3%f+r{{Q)1=+<{0=j!n@0HI(kq?-<1gb)t_KsF_md{|o z3t6bnc1;yR0am`LYSboo!rK9YK+9U*0#Sp!hS+0g_K8kQRm##&xRp-NbT(S7DdCez z#{PH;{5qBh+^xh7$M_-4>C0zO&GtlY%lwQoN$+AC&yKPAi2H#rJ&J}~iAJ;rEcw{(sI93~eFG#$vt$vJ`H`w@9YHK!xc<^7& zYZHV&3glx%;LlB)>Y$Asp%Y+FPnw?GZe9_c+$3R3BFCas$z;@-<+934OYQz(ZY)nu zF(Ow{alxU{b6hvk5&dzupZB6_y-zE`I<{VSrg7>p4dsuP;Q#Rda2=;LV!l01#D}rA zJ%TIK?peuQu7+ooU;xy?a6tmt;v3gfufH=213r2Py1qXXf=on1;%cmRL^l04HJ*LD zL%>BWQeZbN^cbeBj=6qn!TD4x^}f_NF6NV{V1S+Ll3%F#06EQ`M!BDnyQvhc}+b3)3CJ1#2XQ#NB$9@!oR_OAxXvP99?c+xPE%{xvaTkLH!)(`Gx zx~XJ1;*ECSmtL+wuP{-aCb(Nnc%PbZSD_-z(fsbne5|{Bm!+kCWw^A%M4l!SS2Knk zm)7%$cpJDzL32BKxb>l_X-&bI{nCWV)d{BBwh4GGNZ!Q3+InR<9|q=q-Nxez2G&td zS$V}+H4p!U)n~oZb=ooTZ{JOK#?#zB2sZ(uJKQYba;iZTyyc2g(yKH3ekj^DrFNbs zPxwQ&j60a@?dBWxJkTCui*tYfu^4Nn-Dn$@45i+HNmBwniRWsyW|jT+?Ywvz=>(R*%>9m)(UKgJ_Swho5e|zSGlh4AKom_K@+Jy>MeI+ zHh)OBEmx&Qph=3d6~W}|&v1XQqi#CZh16D%5OA&v??T%dyamPrp?;Pl>?v#=>P|>vMO@t3R^>t$ASdLy7De*tw5m)7Uy_ z;SVgl-V_9v915y))^Qe62fbCax3w+{m(!15q}{)t+V0Kqqb>JizVlD*UAZi66(_{1 zzGZa}+ghEu5VsXnH*ov}04m9dtn7H!`9Lga)Evfb7Xnzz?jMi0{cKks&uS~4= z_ic-w#O9Tj1|w9aIjD-f8$ET;_FM3l?>BYuq@n%D>iMyUW<71yf;&G=dRHA#$>=## z^=A?D1Q|_BW-A6R$W`sX@Hcf8%x}*@leg-Q%9f_@Wy@{6=%7Y;-+7dV2Kj+8^kdz* zae%^LE1orO->PLoDnM0lPld;-?t)9|K)(<5} zo&1{onkXNVNFU74&+n^#`Jd9Kq`W9yJZ@nm1PWlCf?)=bt!0viMNxYi4aV$UO3k-* z&SAil5u;a=X3|+&j32~;@JL-nwa6+llfHKEshyJrhL+08Ce7-pj(ANbk>d$5d1!%|GalUw#yP3Tn$o1T!C8INLkPOd?e4X|A+4ni}K zmkpc8OE5s%=-R;hV*((?rXZz;i=Wa+Yg^dC!vMj`iIo5{`+jGym<+AoTiO25@W)F| zTSpKZn(Te@0(o_D$yK{y^M$KzXiDOK%4wg;`0u)JfWxytu$mRe`cnji-z8gHADfiL zZM&C5(CW=4*`L@CCsdKoF?lr9_*AT`>o5-Qa9Sg6x;aJ#R@Drz`Qp(4+Dk@?(Zf*; zN_h7XO=gru{x3Lan6xbk4aZnbp4?9lJYYbH>3+kt{o;3R3cF-LC4`Y7pUvd2xMx+I z103EQ4fwgeNaV;z(=y$EA1U$pkoSsyJj~kCVOzCXHSPp^N>ePi`#_cf=^282?Q-;x zH(xaa!sC6SQD&XxtCRtmiC12O7shXvJyz^5O51HnR(Y41A2^Od`=+V18+$u|8*nsG z2RQxUVDnseJH)RY*n$X^M3?IZDMT4881Jbt(HY=TmPBwAm4CS9tRR28^Y#GgqeIMj ze^J1Guee2NQr7Kwrs+sOmgXV?&~f#&yVB5cT$7ssiyRWygOh z47>(C&v)7zF^9a^!DgO+Vc?DE9R=Y7mOWTOEL+b5d$0f6_0oyXxdw&msD1^7Sg;|T za|DM}>e%%*wJin5<*qcr zb_D`mW9U_^?qgu%N9*PH@&l!#QJXp=4sEY;)iRlfZnvEIylOn2Iv?}@7ofu*Vqpxz zVx!TT!x{%X33my&@h{YtSMR4#L2%+h*RiCOjMBtSQ#~lOae7+InxW##Vt|=7df1D7 zjwtOW@i+0pZ+*$%(rf~n5Zf#l2F(#hElGRRoN0OV7!>n7i*6ei0UwRmMeZ&W)y2LL z`uF+C0xl3mzS+60Pv$I>C&uJ*Ee$+tJ8LmhHl9}ukHP@MnPUzDU4 z(kSSF(>fY^)i8B)T9-iZ*#1t8L4mHzQ`ymcgPM}c(PeeLpN!NzeYc>`y+t=rk<<59 z3$Oh4bY*{rASXSnS9Ydq(ym>$AI&c~na6v`F?u$~&Iy=dkmt7_X!RHnq}0NI+~}2- z{ZFT~gp{dowptdjZfeSt9z)58-p1a;jFL1WE`G3l>*1cbg`x;9CmD+5=(04YC4KwZ z5{Y7gWz@rrL3|Y43qgt}!+Fc4!-tzPnx@ihVu)z3mP1M35%MD7*#!d~fz9N^^Du;b-=gQEUqVbnZW5lGt!iAF?kR0aN zDAt~-if z&=GBlfZn2LFyA+B@P&TCqCCN;(z2tyj6>>;`sZr z<9P)GImQ|5364pz30}#j=9c&GNj>*bB#rcoK|rC@fB(;`)WlUlx+y98>BtpFR`YRD zy-WLud7|O#cZWzmZ9@M-b}inf4vhmQnMWgsa~P#3e9w-fM6=KMG8fm`-%k^zQ;Br9 zu2DU$YmThNaBM_z|;o)r^a9o71`H z;n*?p2c0L!<#q$ctN2Ek>JlrRgkk-1C`3E#eY2<5+R*O$>b;$~t2kTyv=Y-;EJm5- zfQo~=kjP-VtEKuu*ZV2?Dxgz}UR^v|hHAkyenBtDr~C2V9@n%qhRrsDfSw*LEpXNW z(nd#Gtkb^~$>dC_YpONf5u>ryc(rKH;A(aQy);UMaC2AyTRCTM?d74lE2lIE6a6UT z>uHX4140wun{5FEyo3X!4)02UQSSR zCfm+8;PklWMw1T7*yFz?hD=jw<@HbouwC?gB*|zrQb^?CL7*g{klhP|0WCd(1d1`l z+P9xnAfG6F$_&<}!tu#`6e(tD`G#M*edp?edO=p`rr6`u$G%f?A@Y?`3u)yQ&(zfy zOkhADq3{FVruE>(LIL&yGZiq}_F|ZmM_>lWoSOW-D@N9ezCWV4p{HNKOcY%6e!F;2 z>P_=uoo)+D@*ZXLnl($Cet$#XM?XDGVtwt;1Wc-;uNdC;d5w9z0iEpDRNKiqnB1|Z z!uEBpAG5F>_BR;F5_iv2Tkl_YwV^iIo?U4ln$mxWz}h(P(X!dkM{2|Eb$jIKrcn3P zqoI3yy^+%o52mlOxhjW;P(~<{9e0%QrE#Rt18;_3NwX7IwHNqmaQo`3KR268_WNf zrm20k4DbH#tC;v;REuL@7YfGs>!5*Y?%lDvck3b8Dn(M-nY4jl5wLx>D~|Hf{&=fM z-ec!KHR{dlotxC~?jcP=?~7LpjK6_;YBVH^u+vE}@_?J2{)1$p6L)(Mqvb33;+{-Y@(m z`Dlpek}TKkvF1%K{$yiC|KKju?2gqpQy0a&R6GM0TV?GoEiKjIMWoK`>g(0yxe&UF zVm`OsdQ((ddoAyDyl3nmm920WNKVY02ZktoBsm>o|v4>QJc%81|#4 z@DtwRq=hE#GQ9B}UAaoi-_Br{T6-KO`p`KgY1uv@wbcu&EJSB7;ijsV9#=jU&Uxw9 zGtYqa;>?O}FD*kS8i#w{f;c}1|4^?1@D30Fw+8|6Hn4J3@tiAU0gw*imly%1{|y4C z8ix9jgRpp0Uk41plf1lxpL$5Rj{?QC5GAF^22~4uti@uLTW0I1tJF7FaYI2fgE%ELz$lybrS}> zj{wCX14E6V(~fF=_2inn(YOn3|4m8U&}?B)7-tw@0BWe=i1ifI213IHF(8jF?^$rk zws$psav<*MnmsAcIrJgc*igbg)L?blVOPa5cQa8J=hSZU#$z#OM>aWctYnp02?Xf5 z0tD@AqApq&cVi#&BAJ1PakSj<8_ldSMf(*S0y1Qm!!~R4`r8MWPZwT+OoyY6uU2a$ z319EBTHfzYvT^AcOaKlaKZN6@G*spNzS9xkiu?;9<=ZX`FMKQT^?4?cP7nYCMmoUZ z18E^!;DY<|8-ai0dVH(i4Ct-7^EcPj8lSnVuwUad-zx6^gFeK_JRReh!6(cf-AyYF zHhsj}WlJe;%zMYqrK>3qy#dZM9}lv?urEL&XOEdtnp)VSW4#}-FjlolJ1D@LW=?Pt z=5#PXzu_Dogy;^~x4V4B5|J0AL-?F`7-?R(!Izc_nHs`7I9@W2B{b$;<8OF8RCwpq zd2e>NWqdL_#C@^PYDj)n4h5UD%s zgE^m7koj@4&iQONj#I8YrFO@l@%v-aG40gLyBcB3Pv_8?@ViJ^%ObAsEh=D1M8AA; zf<`gnZ&n_eBa~O2@mZ5At>{d~;nV%dr!?C)Lw%x5;1S+wZMb1g2?zz>i@TCP4rOa* ztwD-M3tW#vMs`_7NC=S{awO68bI#keH{-_e_jtFc#Pt z`6EWzuy$>j<|E4UJ^4f}Lr5QmNAeS?A;J_7(K(tYE?n!WJs8bAWy#*~l21Lh6yiQO zv78ya=2WoYLOMI<2QF?(!+`9I?*6_0X!5E(>nFo6V$x;8ggDvgx^x1CvrJCEg?g^p zDgSsL^7kAzl-mnox)d@3k>R-a0lC8Q2+@~_o1}ovi*xxy*_oHLYkT?oi&Ny|3 z))qD-;ej0M4f^CH& zhEs5XlJ=DS$s_9;Cv;YMy}2Pi#>irx?vIoaiX!By=I=K6#siV2HT?SvVka%j^QmR6 zKIqp3jp;HAeh@m(^{rh(zuHk5kgN4HcpR>2eBkkv(JgEBS?Znim>sTqHyq+wM)FSy zhnxIT92bO)TT9rQQ|(2MyravWJ;(I)mlYvb&VyL$eqrl!ws*F@JFQXsg58q*xms%w zamUMPZX})MGK~=JebN-R@Y%^D;-2l;O^XutovKok*R?4cQ%O-z0wHhG*yepgDP-Py z3ph7+-(2%+tDce35QnMyb>>Opm@^w^FxK zmmNnIkW{|ZQyum;q?hq=^hkG}9Ty@>=+})y1(cYL>VRBGdJjgNvol|bw#3kSv8JW( zOe~awW$jsaSRJorW9%AH{tVU5&V}yaZIvi{TT<=;d(v)PNtZA*ODzEHWt3%LQhFE7 zSM546!Ax!zgxAUQQ9Sy)RRLIz)6IBTp`vJC$#Vlh|#Vr8GBpwJJ1vQy17-$QaEH|0TMVm(;OC zZUk=j(~|(@6x5X`+mT`z=hz9J|I+d|bSZ}}J>FBPc&AnwzB(*lnLUbX`>19E1|?jB_a&>iHtEP(G1 z7Hs%G{r}F@={ZGxsdx&H z63J-Sg*t$8_pwz+30%q{+*@@qBt|$ZKS6VlP^UJ2w=T9vWUz;D%3Rls?Tl-F=~Ser z3kG<6NZoyQuIgW!e{XNL4Sjk8qekO=M|XIom8qlGo8xu2Pdc6AG~fNe5CjVn143%9l7XtAfqp} z-&^Y3e-ah{H{Bte60K>DeUT?VC-W3@ zhVVK3B#|jM<=ZsM*8CPm!oZEXD6P`BeXv+t0%@5}p~yoRt0?>yGEX}eKprjbs*?WB z3`#X#s`-ks?;@G&c%gLDQ_fPjE0WgViT(arrdSoGQ|R*iv+{c8agc*ya0K+xUCx`q>M~LrJ7c@xHLe zyXW9>erZxSo`@1*h8=r5USUL8os3Mdtjv>O!kxFJ)h`1Mf_JO^QAzF@+Xe|8-!hUi zI{OF+N(6u1oTD&{jpd7-VsN!Obctsfga_i+uth|ensIO5N4y$Jeb8?vLqXsYaBxgU zZ*HzFbfDSsQcL?Gp`{vP<%7&E<$gCJp)WJxHUR%5gU_B}MM7V4R(LvuKTn9P{6*CL zDK=^T$NBemGJSwax3E5KNqy2E4ap&Nr@e=fKbX4d1(SW`K4{_mEG8dDC>{Mg4Cetcwhcjk7spy@U zlm~*RoRUpWUaXeL%afbcq^4K-@8OG0N_ZJra;EK=1CfeFIsl*O(3GJ+xBbxp7g*uK zU-ZD!7*JGWkU-ll)Up(DPUs;FzWRX(2Ar||{E~*h3azG+e`&bQ4CQW|#jCk(7O5$@ zs`FWsGrv~KwKZ}1HFn2CIon1-hT%iocM;wR-JA9_=fO?6Oudo5cuBH6ckTNH1&g%F zBVfQ?l-7o$c5t^6jmq8RD>jFq*NXql1J!;wXHJ^bYV-@s3ixt3cZQ?^8OH^Q*5c|P zCao`h^MyBqAz!HS2I0i<+FUwXRW)?7?BO@DO>ZD4Smi&7%=Iky?8VT1aORDcO0O63 z=79-9+1uK~)0C@ANn2~?9Ad44EK{@U8{yn90@Uu9zS*zc{z~K7xDC&SY2P7;w|uUg z9Cg_sa1S$%8jEwX|Bt#K`>{M;<~-W)ti@1=PXqt@_eiDmfFjCp9J7Y zgQ3N7D%Vr&!t6vPx@D|-v^~z0(cA$|>jnl%#KfEAjfsoe+cj3A1vwXXnh=}~+rD?# zySuUbyZC#x@d|`94i{{Zw<+l|cl7PM4m!!f!)F|-$rCOW3RUj3W1J?3FU(1#(_d+# zKnJ6w$#k)kstBJor(bs#(_F^$%~E1`9Wi& zXlc?8BH*@-H=wRR&=D8Q^$KT9mhZ+a2cg-TXsd?O1YL1TEO5 zZ99g=%VD9sW>CUsu_obGQIKB|!TJNx?GHGoz4ADwIGcfz6%E0jqM~e~$cC)XjZgeV zZ*12PZHo{)K2;iZxFYTZZE`NKkV-?3z3`u`yY^uvZu_orVH zfe^e`5KUgO_p}B7_Tx`9334fIBZikjBtECx9ZMSI;44yFnkgfr-EDm~p&?B6gf+q? zPJvg6*2jrOnWh1Bb`r8KDtKXYLAxHR3s(|fWrwUBM{5%9$69I_nviS_-NuSL zww})BMYNvtzxzh-9m1qZfg_8DnUNxG;33|V%iikcR-es?VhpHbM(&K+aS!&V(jNDN z)-zx87Ucdn9i0=q>mtOQvJPRKED1*(7s}Pom2+;<+1=-tRx_3agO8u-dM_QCv=E;N=oH{3BogzYK@sDhic0=mF1$Ow^0c^ zq>$m?w~GKNDEa6arluSR*@-5_T0E{vB5B=C74RLTuU!#ORx?I-%G~t`j+x`Fy)=cM zC+szqWV0S{*$-s1%4AM&jI(w+CUc=9D+!bZYzL6GKhVFA2&GsmGpd{Vb(Y#j?dSs(p^UDi)Yh0>19U93jaXD|h+& z6OsJxldA>n4$Sf|gB>qR;uOX|OP3GGgSTq3-nJheCzl1RNcdGQBsNXtCnacm4Nht; z&l>7FNRJmmH}tv5k}R>!kcC$>iB0(ho2$tAc02p2lG%wy-N%rN>pnB3K9F@?wpb7K z2uu39J`{Ej9I)`GdFvn5_##*GxV>C#=Vca!z98OK<{prVU1Q)Z$dt3O#RWw*yuACXU zvl~w4*h8hM+f=Q)6sBrU4jr?kYpLDd942|&R9}^9rR8$7ATNqvV|xu1?~)C4^W?3J zc|3lBHjCSA)dbllJSDGe100mUw^W8kcOCgz3652wuQGM{J0?}g-n0vyXnj3X<*7)B zS!)$U+^AMPwr5KIB7X6(r}hO#YFrlJ5c|()$?T1g17>Z=XLHcjANFtKmo^p>+{YYR5!2rF!Mta$qxJQ@m*ZSDWsVn`I&YKfJubJX z1spoc05_{d@c3-5{P|+)IchFv*ZO&3h+LxOii=K7Y1dae;t{Ja`!EfDEvl{H!@K zts@VQ7j>*BupH&g6Gn|PwGt+|pkkhQAsR)?JZI1x+`U>k1Io zz}IbYT%*LZyQIQG@_`E=^Q|vMe%uUvL6z_#i15D$OHuy}6MN}`6_vSoQCOGA--D2C zUcNgJ0AmZH6ku=X5y5kTZlIqLurr3fd4HRE38%@HM4Zt$g8>8k)K5*=aK8lx^qRNq zEma&pIsgsGd#V)q6ngs|R~SMRVE6$8ygy!q#A(t4Kkl}c1W|SpRTp*9i#y1;hR38y zZYAWIqY0}Z>8SPv4A>Nq$;jq&<)aBnE!d2`VwF5r4FQkhnSjdJlY^Wd{R~K7MJ#r} z0QJQhqYimmY30iksZk9IESDx`L)TjS)z*m#g5yWj#zIxA-dsoSVfVDrm9}bQ;NTI3QS1Gi9XBIuHt`j29%##z&Yv>K1 zC`I`evuZ7+Y*JUW;M8eT(rKS_^z!yxoB7?^;t^Z(+FeSaJq?GLCH zX!NnU?+ap#jswbSYV@0MNO&*`TCaE%J7)EP9kZKMyXtjO>WY_B zB-*x{OFT{Bw^y!Gl2H>Cs(r_(nh*vk#Ti`?XsbT()$J5v6ls2Od#qjS9a~jZg)NFT z4woF^fz)yFFuiy$Ak6qZ#8j|GXM-e2vuB;y)u5~YR+W(2u@>4?8pf2R(9W7f>~O1n zliSw-oU0W40KuG7V7h~R`Rn#j-e=P>4dnz4QzsksDcYHU*$1y0M0j#JzVojC2~OCj zdx0`vpZGIJzVvkN`qY=`ILcV*4~{o~3*QsBwWd0D*#s4TW{%U5&WyWmq|lg*#fUS) zOVB6LdoO%A=L!Ze{t3tVTfXyknp8f36SBqPD?~IRkSg3W8s-n`- zQIB1BaC@6-b&-V!E75o&i(h(&y`R3&A0)gr_@)qkOi&4;8FDzjKAj;ojn!c#O#JEh zeer)W`hVc{jr=o`kghlAmuZ2gOFxc*WTqVS;Ng-Xq?}irOi!Mu&C$>qOogSW>5U7l zIj^gye1~oRvB`sw2!_U%(@x`{l@pLJY|5U-DzerK&aZyvZJWQ-+%|}Q6Iyip^rwL( z6^`##M@`is>jbHmoOi1h5M=NlPjp2i5<$(%yQ{KNMS$xIH3 z5-)Xhbl9sRS8J2Hw_4%aT@)M7o*`{^-1BBXgaNn^3p4DF%yreTYDv2zFCsc$V%UBZ zB7c%(ms?S9I++?kpi%EU%E^DmhzjTM#pr-)z5n2ibJv!pwT0V`qR6dD4b9K$ZKei@ zPRDy`Qg4GEexUmTkRi$bd4@aOYD+H+2ylGWf?L8fH27*!ssD2afSFws5xUFS=iaQb z-JhI`ZvVdL*qy{(p_5?C`LW$ZPftpQciMxdCfdAz#+#Dg#|$$yUn;z@!S!LV$2PZ< zR%!~nckX$0OYz|>(7sd2!`s-1w7j3PmjlIaxK#kD(+h-o8{CZ}Ru4d)jRAO-9 z`YS@3d!ItFuUx!8&oa6QUAd`*=YtQLVaIK-{M_u>%dm1ASAW~-16Bsv@&yw)-K@FhX5<}8 zbbe`C>Wy2ZUK}&jnt|##XIyUn6)~Y#<^59J#=_1nMC((NrSH-(9WRYdqB)GE$AeTD zVuolbuP|q0vU1H?P4*?eYRqW`-2l`lrFkh7yqEU#(dZDkrN$P<9@WdHq+6~S2wRp! z-2}Tdi|pofoOiOH{PxMGWLllOY6YrNNq&d?ZmQzqpcW>3H3V!0#^O$>9*W>Q*~v)= zK17IU5Bs@WZ!B51Yx9h^%k4z}PkUz_SLN32`-LcolyrwuN=kQ2ONn%;G>ZiyT~dMy zixyD2LrQYdh%`tyi|+2OeIIo1``PYSbf3ECy!X6+EfGF*J#)@6V?1O0zN3Qoq~cSj z!Wd5u@g2liD`G9iH1?F0CiH+hsZy$y*eV7&wSlMIGXe8O)nz;19*c1AI)*TD7Z6D( zlxz~T6lHErTN0oHty7EmLrl=z&`Y06vuK*AoFjXsvL+M6ngS)tjQA*nr7sC zI7{t9Si;OQw4F3M;TE&r_BIC&o^i3|)>@C0konFzie#cLdIiQCEf=gs9wm$Y)~)G) z`Qqv_Y-~_rQRs7_i>9=2FXlg|F8hsZw7eL+webbqgqoxLscdgg2)16q0x}B)U zZl>68U6*{)dmW=Ayc@9Oln+Sm;Qq;psYBCcKRkyaWyk!%alX46=Tp z1^p)CM>ZS~vpjq?df7wgQ|Jj6#`S|GEv*t5IH`d&GDKgx;P*!Nu&D5kW7K?b5u#JT z15rb7hwCyVW@jAWwk!S*7I@$bx7U~8JTrn4HjvyA^9h_HX~>hBfP}(o49lVwet*-${c8#hCd#$W>MNPqS=_F^?TYkbCUe-%;YCVo{xvDGV1s|W+h70!Qp zq1O-LJ{MJs-)j)w#Zoi<*-IY8=uLuCzfRy1BnW(&oN;oa{tg0gGw825Z_OP>J`E9Pd_A~{q=xKu zo%*J;_e1y3rJKTMDAgBtcpZvU`9E+5GoJuV1nnW<|vwtE>1STu`P*r#eD@e7X04kNhoMVUAkRp3UBO~mJM&Gjx zKE6QEk?%ct6`7{4_${;)!<)~qCt$GrJ;z9Am9>Rs^}rG!AjGl>(4&Pl=lVBLY_lG+ zpVvKfU#i~zBW(B+SLJu7l_&4U66=clH38Nq968uBDNCytsD+SHionqqoXOvxzcwWy z7hgNocOhkr(!)biJk8Jb|C>1-ca!e36^ZsWe;^7I@UZccN~}E%;H%tefN|TCGxuBC z!dKeB`#nt8pf^8}^S4BRp_0QYXLDDtT*pwf@W2$6!B(Z^RtJUCC_EFbrBIT*JBG|T zm%mKx8#VG$MQ?nGE8etk0TwYbByAGErdX_?T(~{?A*iOTe7Y!mFFDh8RRFfY#k>9D{sd8*se+7u{^Hntt>SzX4jTNC=N4N zJCd_0_&qj3~2#yA;7Tpn(CxX+CHHcL_@r&8LLF^$& zd|94~+Gbj;O{!^ct+OY!o9y`{=+kNFSUWwrplaWVacMJWyTdA1lXibDV@`Wj8+=Sd z`+d~3L?l+`#Ep$xd>}vS4oMdwCYuKK!_QzR@;fuyEi+t}8u5kKhmxJ1UO{@HHf}^2 zst%n5Ip2Ryou3`TSI&c$oqo%6Q8ZmW_Rw8;8}1W|S$-v+ zN7A|$&R{?|LnX6?38n2xiP+x(qiWk%Z>y$8wSU>l{(=inYE)xq9g++Ah!uk^BB<46#el~(1K4lca6WTt{I z@C`MpBp`Uy1zWd3$&)$z4`trb=HFOY{kUA1n!i@GW`Z~*+r!LnK$d}+aEXujS1%Z% zFHKDGc>?P~Ju|Y*{gvFIWfV!+vQ$H~0qu{aIG4qIE~Yb?LW=`uzB$lFZc4Z|NFNg zq!U5HvpU5WZw$gO-WWI!4siOTBg#ap^yglyiXmi^eN-|Uoa})j5X^%YGShiPz~sKl znd-juc|5YdTp=-Mxm>rZCKAu5P{vN6ppiyB7!=Z|@{HPb{b=z969_V)4>v0}YD{*z z6WB9?AEyaoD#nw;@eFlDPSwa|wbeB_$79Z#g1>fM8OpXSI^h~mUX#WO#b5EEk@YU! zLl!D#{x}j>b?ser9l;71;#i=oG1?9}e~%R?0zzeHxMo9w_dH?JfTsZBbaE*A3utcK21%Bizj11uQzil zstj_h5#H^~74YbmyK_WTEj?%xhpw~--3o>5>f>F723WOYLFJC+g7j3Ix#+ zQPCw3(SdOEY#gQp6_t8dbBg3|TcNd()w3{lju_aFGA&4kJuM?@OJK&>AC+nB0;iVt zTG4Ily*GoTp_07LT{R5trha%^V?D{~*>D~Dho)TVwJ<->QbsOGEiry(GFV;T^rI;g zjrT&7J+zIwVw-KNnugH$XbkJvuH{Njpl1$Cy&UABJl$$H&Dn6=JUhk4W5Zxc%`Z7r zUiYQURBt@HG9?Nkf2G{XrmZa_P*HN<2mTbF2a)au0`&<()Xv1sA;k}lGwQI9J+r0N z+HyEx_xYq8Zz39+qsMjYv#VD>>X2d-S)H;>^XJH^L`_KJZ`fd@qlD7Ex&K+!ow~?Z zoND$Z&*MZC&>ch%Ocgb>MBitUPK3hY5)O9P0^S}t0B12QAT>g~TUAo#6qJpLYKm<( z5|^K$52qi~8O`v0TKn$Pt=EvNIG$BHGlNmHRsv*M6K3jMR>@CyNAzjtb_?oTGWoNd zC|w(ZI+SalRd7AFOTgG(s6RGJ3pdNq;T)-RqV&6p&;DNbwL#Dw+H=3A@I`jTqAl8R z=aTvHIhf99aT3+%#c3nS;A94n(o0FDtT}dxp&S-PfAR*K0D!YJ}T_v zBw~+w`2?IRoi?UmewjzjAqe@Uv5`t#%v-D0%FRQQhrBMBn4RfMQx@lgshsuH6KwoM z*Xw;0TOVQ167g}11|Mpxx!)Ae)Lv{iOB2VXKjznIJa_hg)AG>aiR>GEk@t5$>D7VA z{au`p;-6T%IMIb$L2%?4CSx;_sV8l^h}(Nk)lmBir1c{@8Ivku@Xc4G8tu_K7uj}dhlni-ztX6Sl@2+>A9y}!G2BoFduO%lc9CB z@>WJp@$uN9nH~~^O=I=6!cg7O#DG_IN5hgen490I?CNe3kdkmtRo++3o3ra_d2ny} z+56j$Zy(U8Z_7y=vI$9x``)-2e8qzYv?uGkzl|>Rd3t|ak$!xHHbT9YUs+P-(?SC0 z=W$2L>5f@+ZdrD-T#MAI{6HfLupv(Nd$d~3g2%?AB5pCEVCI9*#Ho$%1-P|vVFO`W z;|&Js(XR{BIYN!us$;Atm(gp+X)u^0yJW4pDbB zji~cblV3;9;9SU=(!c5c*_vz%=Pg0RcGGjOn;$=gBvneZIeB1HU&E7)9qy31Eqo|i zOcF~rRn_a=j_+@c_mQ1$eI1(H9e(tY@XGZU!vcY(h+S*NV7V%V4Mms}`E>J#&XdUN z&{jg`ZLWxs)@LY`SaHR2YFoxZiKA^usRGTLaR2wN6*5K|(~OVU+3wz8!&DiH^B81z zn39^qSK7Ieg)^}2JUU6 zYM6dSEqTRcY?>VD1GYnIPpqE?5w?BQXO=Hu%Yq;@(NUICrIW^--yG0G*bktUYnLz5 z*4CDnT4SC6JVo;!hR;m8Izhyk5HTWUBSId1t={2IJN_v{k%_BCOeW%E1&E<5D>_`{RLjPN{JM z=Ak;bQ=Xw3Nr|ync|M^v7|w^jr^^NLgTb$@n4XrEgc$i6VoR=czlC}UBR*7*FcZQZ zV6@ytN$k=>F81vpics@RetE0@3pA9Wv59#|clpG366LX=5DK{ltmSGj*EE;(qc{}M zX$q9o(57q0y8(2O+l`Dl6_0JoXSF|;o1SAf5Ek%swTPQQIT@r6^|Fx+nGQgf9GL88 z+-v7sk*^Ljj{7*)xCXhk(EN#a$lYWAB*xWapG{*#c5bfNXLQdPiVcq5Y6#EfyO!Jl zxxq6~l+D(NK(TcXwjqKizze)geSAvLYbQ+CdBPP>a^zC7zQ{LuJP_$8JZrFNa^{-? z#CzT5OdS7~hU(W*jXz$XAimjb1bBd(QgwWGmAIut`tol@)w_LdwNVH!!)!lo)_P@?O^EJAxb%4 z&LmV%p~{4N+*SCm`_I&9UrhoiM#}*LH^8 zq-<=SWjl)%Zk~Mqo=gV3B)Q1bp6PlJ@8pro8PCc1c^^O(d}_8&PVIHf%gN;2u|8zt z%DR+BYspjRlukOi%drMD%1w~^*GBWU6VRg=g!mzkOnp%}N$mUVgP9u=u@(dwZb?Aa5?2IVlB&EXHFjroL;EG+K3vVodFxFHuh^+)RfNueDto|NxX_X8FEp_0s^={bwo$H)Q{4DC!%gCO>} zO4|=nZs~r>)d73DCQ@ZZL_4=jdT4wlXQ2E#rKB^5ihBv@8f+_zwJsa|W&_iizj?F*vsz0%Q73Zij+_Ch!I#;cCRtEdc2>KV zwiTY4vzDYU1Kj0}ZimBNXp@If^^;Q{@$?bL5B!T0sspwz(W0?i+GcEZRMw4TxjGou zr*xYu8bUO%!P&#eL^1}IUP$n;o|D*uLg>@dd+VcWwqtRu9<1Jj0w6oCr~+N^NZ`AC zJTR`$h?t}MJyt?;xVx5ropVw7KqP11RtkjdY%T*O2G4h1sq1NetvXR^}K(P(f$LvfKDyTMk)*2!g}tibYrU3c`5F~i0yJDt)?nB|$Y z0FFdz3O-kxl^J0m4YdafFLkI4U8oFos1tRVrq<6VF8!<3ZT?@Ys{k&7t_S=BQ%C?8 zj{~7l!lVh~BZms^;6Bp_2v3k-W2nmOp>$4Ta`>b;A zPe;;v{lg2ak!)(WD|?2T2zPh|wt9d?`R8Thsy6cAWAmu>D{v%Yj62FHUl-CCUI0LA zGO47Ktn7JOGI9@QA1Zyc(b}9$;iDPA>6wHZHC?|Ptw5teDjKu3Z8ZipIL!F^*wb4N zCnW8($H?VG<5?lub26BukBd?;tcQAwc`6?qyj&cNdY}fE#9!}`p%6UM#5LGVxDh3M z`j!I7Ssx@}IYW}o%Ld4&r_5V;v(_B4Om?Uj>{G0Wuha_jYTu|&TikC#!TvZO+~Rt% zvoR<;XqsAT>{)}RSB_NjY@K#lUTUp{&(%AyM+=HMQTwsI)>2_ixkep~bZWOILZ}}?q^ZozenS(A$M;s0|URyVfYQCfWNze?--?saprS7u>Hlrs_%+Y8P|T- z8d04z-pBTCDWcj1DE{FNpfJ)uK{wMseg?}SGf=3hbfoRsyJf;5+MOJQDTET9AH3!J zPC*I8^0yXYNjmMl^OQ}`!poH92_C;xaLJ6~%gA)-SjG0<^zbZLcAzv^vk zBhLW>5n6lE^LtL{1KBN`g9<{of|UJNUGU|cG~}OsK$ok@nk${LG`@mYaqEPhN*7Y@} z`BGPE(^XAn6v7?k2Z8D_F*nYsHd99WV4<4kVhwq_`@Oj^_)$d?&1;4o<^ht4IMK0Q zPgPD~1TwMx7L5!qkh_vn)3@ggvlveAmnJP_rNK%>0!`mNY+ghVxAD&>GRglm;M?!Lj zZmW-@4=_FPzu)t+M?>-2OKx?l)*It8s>Vk#941fEJPJ%aZp1`QRBmePm~Cn`z3{nR zU0&gsOUWkA9Zww!vBjt;dCx;V1D)x*QhzS6Ial8?h$#TVR{ zZCCCM@!};L#h>!*Ahy2?QL5T&`%x{v%7XQ!5{ken`!g?o|a zXKf8_MZ8hmHB zHl5}tG6xcOhGK zg+4d$^sQt<_H~^tE_Hh9$TX#DH+NsAkotfwPgIqncBjda#r918afSAZf2tY4phRVZ z7{N=Q-va;&v&10n3Gzkz0dxoRL4s_HUk6y21>D^O5@Y8&2`5@@Mn}n$@ID$*dt!l1Uk<{Tq7Mi));3Ue5gU8sC zqaGO6-a3J?n+2T;CHESv!Q>5IJSkqaR3V|f$&m*^p}IkDlc`LX?ZcpU&I4hzX^g4G zW%w|A0%0>)$jlCoeN%upvnXXsAP=RNXeW@np6)8r!)$Asx1qaMIU%^u$R=&zdpAm$ z>jATYek64%$Y#-e#IZ@?M0J;4%HDTi%c9pPrH5#!p1Sp#n0CMz+r5fHF9xKYDOc`x z(m{s^n7SlyavZoy(CDfRdwV%2)62(3Pr}L+iB$Z$`veF$M+;wb5MZ7V0d>M?>Tm?dR-?|C<&TI z=hu^TW79Mgc|&Q&H2a#5%f28|xlEzAbyl7G$>uZzVGfn9^v7cS4++{nS4C}iJUyPV z*I1FU#+z3F8IZ_wQzsSv{@_L2FZqdqsKT^dH%?+lI3a10R|8sc(H6{>M9Ad-npDO* z=_mgFwiHjJrszzL(6>zW`x5tW_~A*3Ac0czcMNUrN zcwWV;HcQS{hvvWmvPtBy2Xrqa%b{IxUnF1E7Q%TJIq4Ok1~;#A0E=t9r(Zwfcx|f1{}pr-;gwYDJSDd zFVmf(mW)y9O6c?KS@Nm|ewEF%@N7MjthoxdaMY8mqiG$?edSMQcYwMKok8~t{O|M0 zq6QV<(TkS9tww1%n}VF3nWx21p;JAm4%}{Mx!S#87N%Sp;zT&7*(~Vd2ZAT%7YpAo z(`uM1uhuTSt5j276GsEYuZ>7Cd$OC7G$oSAXs$I4-w3B1lhwaEd%jt6eqQv|?Kr>L z!_l_5!Pv7YPj3I7ljIFSNT6zr_h4zd`3u~hV*ffjSD5j`M0Y!P0Xfg}RvwB}kVUuV z)?$RR=_?sg>wU3QY3_%SwYaP?2WwBIj9) zkX+oIr{ozlD!J9$?2YIN4%Bz*ODR^9J&#r2?aJLL5>H7eJ-PKTg(OpMGA4c;e_~<) zAgE@`3x6h-eD6j!7o~@i+|f&$Y<+v1wY4zV`2crK@pF_~zN2Mc#A@p!mi4@aH_wEJ zr4V<&x^kCH&4(!WmmC3X$NX&^l{iwdY4VcO60-*3CX{>YcM#teT`)>(FaQ+o!h@a* zrutlft=?_Gv}-==@0|d-!YKuVcT<;~AL%1kvghb)kB!Pk3B}?!7ZXiBB%)Gy{Rz#o zQvqzH+s&BNFF^OTLltEY(fd+2A!)yx2F91$Z%};@hCte+!R(&L@f{KQKQTX*OXt;t z%QXA&l5zWBcImu+bM<~~fAn9RY2Iqx>QT~h3(oxd)C!6ls8$;*BE-0Aw3pkT{U!6N zbm5qizcIppZTpsh!jS%vx7}S=oUoJ6@RQ^IpUmr5clr|Z)4XJTn0~#rUuu2|eW!O* z!34g`N0whw#m<+{9U~FX-aZqS1q~+^&H&TZ4FFeWR()iHEmK*%p1V70ySr;;rXPw+ z_p&5c7RuFfIE@(gSyJms@~S<@)SLF;TKP_tZ*|F%X24Mb8sD;dRdg`|Tzp<%+wa2p zItE=x5&ys_mfxf}^^erwC+>IOow8Qll_!xX*)m$iS3792PD@dom&??V&704%&W{NM z35u?0j^kg>eWN)yYCeDG41EKe38_6b1G}Hm4FfSowxYk9l7Zg9*n5h8mxnqGnZm{QCj^<5HF*^oh~{_y%3P(X;!@S^@qh%UkR;Rqn*@fVn9 z+~0q1t@pRFHVY7d>OZ_umwCY|<){R>{znG71g~pmtu`aiUW~dgF($o} zO_VO^-Yhb`y~b;0;~{i9dU8~IQPVc>^zB87!ol!^9WM_~rb`OfL{17H5ir-Raso=) zrO(qvtGk|N)97+4IQZNxHweF?+Uz=c$BxxZ{wj?6OP=$eeDgoxQS-asshIRN0fO?O z?leR5wCP)|<*y87D#rWgH0+1{0e?>OQtRLKOgv@U!h84b3!ss=uFRd-OVj)V6c4hE z`tQr;{y{JQ=*X%NzUkl>G6KJJHg!k^3&2%VN-V+jf>4-gM_0gA(5- znHnD&sGom6q?(EqZ`nDmqEnQQE?IECAN$PNvU5u7FFxsoy7d4U*w+LdJd_vi?g7q8f+A#->%hubQz1n2PcFGrH2ICBMG1URNoj z=^Uwt-M4$zDQo<$8C8~s(n><_&6wY#T+fa#aja|9!|tQ>trIWtTh$%HcNzA-tL~_o zKWEb#%DV)_RN>#t@|3kcL)LD+jBVuUXJ7I3i}-0-DBcoc|HXz9Bb3{FtFah?Nxa8kJsfEfjEJwi795SB(kiNfz(|)4T{`(NB9~X$gVEF$x zG5U|i@eA19--Otun=vjlRo_-KzH_T^1ZC2-zyx;!P>(d1*}Vn$xQzO?$6~<6PQp+0 z#@rP&TAp*PPrGZfam3wJQJP`0h1d^jXP?}ddu>hY?Cy$m>|u)N)z8^3r#WD&{Tjk4 zmqFLdyx#5`M8ReTjIe(xgbA4n>#8d=s z@bzhH;sr;H4;><)%x3CAcZ{%fxL$OH%bnY$kfRHD#dhiu#W;P+aY$5-%~Sx!HVgfN zOi{SNU^MtXYgLC10Gkcc*E>o;g9tak%HM}>GiYl=gvQpU1>J)mtmyaC5bcFF~e2APwK62@p;ZGmse)1l`k>Nc{LpL7EfAiUx+QC&9@2 zR$5K>gb?}a2CDa>g7haropPaQzVYk<{2tU(w>(>sqeG=+_k)ihM4@o~bF3Vk69J7_ z`Yt$Q+%stX^&QrL-#{A%(7h&HgtkN3m4|~Ci~y)?AyB$f_-bf7T76;rGeh~4inrSs zm?wtE1{s@;nar>$K?aplr7+zQDMr6!5UY}cU}203_2ypX^P_TLyD_dA(rS6p;X$AF z{3XkSL?#&Q%cz=9z*}O=cq;=FLV$8e<4aBP*$;%ceZ_0{{>lBS!7~e=HT?BMJr+|?obR3N}f@vCvgaZF1A@;X-I!AcK4%yBh;Ek%~q2f zqD-BsjW^`Yc}spoF)z6OB{h^2(VCFLxeTo9pw;gxHQL?zTyv-#S!(7>GqS3S)0#eA5(_G@xTiMnd*x)^H{> z0X5|Cm7aqroj2$8S}JSqh;*wt8Z+}_pED2t6Ml)(e$)j=U(@96EvU&CqYfLmAcLeI zsI$jvBX1_87@gdWDcB>6qg$rZIfyBmBEUHBHD~V~wN1O@ObY_;h)RIA@>TLVQl04j z`1W~6w|NXFla<3+h`3a|oFOHBJI6yS z^5iz-ui95+zJF{_Eif-bf9QHmVUc!#QnkZtV?SXQ!baCdodv$MB^`*(6EB?`^l9<^#OMJ{GyCo(wxyXhjc(hDS4sBbgZ8!dxje){awFSEN=WuU zv8~9U2ioWB z6AK(`-$GC`OA2$`BiH8oDxBy2L3>4ZZer)3B+g=!M$LV8D#baJj~pA>=h+r`*W$vH z0Y(23_rc&+^N4SdP(-tcYLscpxS&)-dr)JcdOh*dTLwqIvqvSU(QSIjxdN?=83|}> z`bsq)vD{5eVZ@298#mi=U+A$ykDz58E+(nWVeW43qyZVGJ4+TXuW6?F$M^Psv%~YQHJk%3dsSE5}#LU_@vGgPk+=2yz9rn4y@Xz4G!-C}*O=3BWFJlgxFXk-Hx2+M( zN3?f_GL44%!PJIc>zCxi zGc%-KsFpAhH=5y$MLRx!xrKDCpMy92y-oAgu^0+hio{%BKhT%{$w6aQ_s7e8Zox!5 zFW`?4_{$9}hm+wGxi%raq&2dyG;I;oOx#~?TeVS zpFq4v*Ovk+jDxIRlyyiwcz#At_LRg43FdC##A-EG6&nWs0JWv>X_o19^#iCJyo(l< z#)XOT`dx99pUTr-u@y2qfuak&H@tT_U4GiKP5Q+)qqK4p-ppBXLek>@Vr_LbZtRgk zqFRKQg3GL$?d5i}2$Yv(2!(5v9U@OXN!Hb>_m=H-9hxt28tYuQ4`;XyX`-Ixl1kTF zWO*`hYfIS2_v_N71iPE<}T*wePua{wDn8b>=nxn z%xcW8{xv;xdjo=fjO6rTgm~_?5=@(lG_JKM!K&j0UNY8>SYX#m70(v8q8!**wW4J@ zffW|G*eM74XlbJGZiHxd4Li1*hzr#u3W$2z$zvE9>ue)%n;=ghFM<<+gYI8T;-6?q z@SqdJ8!0wpSHR3=DQrnvMAj(}5Hm49V-}shB5L8Uux=7G&O@qT^*=#Y?p^ihjNXSM zmyPw3*te69pV`C&zMI>>BniI@xc>fRId)vW_35JHBD~M4&HeK9ytdEwgpz&!tfY3` z!M1U%5TLv2EKsHK{%q^JxS;J`z8tH5-g587RV~BrHDs1}>?~lmp~imSUeWRcYgd-s zEjqz%2ENO;K3jm0^ozmz+17V)ce{LPneYE}8Wt2T{IttYo9v%#eO zCZ$+_C}ah+13X*Zk?B(HrX{864R*h=y$t|`ANh$neNN& zpP(?yxu?m&F3uYd{sq_rn~{MRuYmM~wBn1zcxKD5$q6a~UqcaH2>;rO{+FE2O!`t= zYKc?w_Md+PJ?z;S*?CY3gZcF;xTx*u-pJKm0FcZEh`BZmc1oGjRFcad5KjN+)Io3f zd-^>FAPbiEES_n`lW6uL^nNw0d6gmQ`#|X54;o-Fd@g_BJW;ENrXkO8Kh%uRg+MuM zo7xh21_p4k4!eDx(2f!a`s+pdh{(*e(4`muHJ9;k#EpQs5|Z6zQTFa! zhkqc~=KB3Kw(^w{+R?m*HTrv>2-wq(!T%-t!> z2l&ViUha{p%`xRr4p6hno*`Ks5NP$MWGn#lTpE5O&<)nuLCm~(rEp=%*N zRk-O`BBH`&N|5`Jhay<0;G`>*7oXcA1*@6TLzL_~E`p8BmR<2u#EMdNFC#>s!UX1$ z!tU9jB}QVt0KL<}+S2lA5H_%zRW^XCtI*-3zurXlnVtL;1g4VROsy)7>Q(FI$XcXo z3bBV!X&REwN_*O`6H>5ElAiT9@okzq%NMP1mP8t%WjxO#D`#No@)W@+@85+Jy;L9Z z$tikiiNewPioBF=BsK83N1MtCuMg7#!GN#%28b_qjHf}uE_o@k*J-faF15b2@#wL- zg|new2*=8u?5GZYe%lfY?<@6*7|y2voLSr|XGz^A8^1g@X1iuAkpHEz;323tx7dxV z@d@63A{cUu#7mwnu_+g2Kdm-#iK{nzU_|#VTViXa{bF{F*fqWtsa}?}ojltWxi{7U z+n;iWc3W@}7##*ehe?`q6I>pn5)FtbA@r>;HPWNHS;U7cw7xLtJ06Y3dFaf-fLlurEiX3(t}k>-AhmEJQ;5u!M`G7 z5iqN+B>3?fbcON`XxYJb1`lr_C{15}L2qdw5_^VZ&QmvkDU|+xZ+21vm}hmZXSe_j z75gRc%JvK{0(vzpRk!1#*0Q}#>u(@?o^`Bu2a|{jKOFC9q*p0$g+gsJd!^P_^jq+x zg0t(mD>)Pos-ruqdUKd*8oAr9R2cM9D_zZ>(2_H>x?S$M=D}#9i6DZkQjt!W!L(OJ zzi#I>s8SfGev;qx4BAu!B7Xm)sS*FtSAkY?^yTy4Nw{Tb!KEc9!yaT-hJDNQ;PN1?#4C3~h2CTHAy zk5TsKLS7qG=_=Rpc(?;!EjV+yli_S=rc}~k!UO%s<847q9tPoSholaR)01X3S^Bl@ zQmW(@xv?Ev@f|1>l|~XyFy2@TdJrOl-Q;G*6jJH8j9dcBk2SmoB2!q8d7AK}bzyG! zgQ>wo`@vT!A)`!nk}bX1VovO_xH(chO|>18IKxZWBFIlX*jJpxqPpe& z@;6Yy9s~cVo(|5w)4&7Ff>!qJu<_iLIE2md;wRKNX2h<{tFJn>c@6?{Nr;+U4Ho6W z8jE~F@1}Og=o{N3dB84)fCzi>&Xu#j3Os)BGts3N`s@`!N-an4hkf-80o!7}f~CWA zzGOBX4llx!MShtpWU}a70CooJN#Wd2nxDR?_R+xp4F_oY^H+}u$-hWsK$7}<1twHE z3)6!zm+7?OXHiT>Cwi+hEkh0qq-UeM^SM&6Hhq@$NyxDhV#a?#MCy-7_QmJUyQiU6 z!|UTb$|?5WDs~6{wkwv-;LWhE$P^9Rg_65v@u!kOy3bY&?k~jRo`l z`U*GIf{ZdpCbG=KMz#25kl~#E6>kIl*zi#pv&%+S*@LDzIw>Tm#}WIJeTbz@FA_ZG z$+D7uN}m369tzr-jjX?R5B0}50Q~JZR6avxkQG?H;@6ey&}1#c?VbA&*Nn8?3ea%5 zyAuhg+CKVGyz{UBhY)*dR0$mW54lDRf8%NYS61=F{p+~?>*rr24F6(x_SA5E@?yj!A_u6Z(^{#iVUGP!(N8o~tgtP>JgoFe< z0RI8-nG0*;&Zb5HASVYf0sw#kpdbkV=fE=@@QqA>DS!f=BZ22CFB48)0TKYX(7i+f zpo5=**8sxc0Z=S~|6!b*{rvkWfu9oiDS@97_$h&(68L{n0!pU(X4JBJt`>Th0Du~f z{2fgYf~X-a9Obw3H<1zF&yjC%13+Zt@8`cG3ykL{())=l{$JFgpJVW7BLrj|nV>(#aN z)TRbP^s3x)H{`6v3{6a>Tx|{Sx!%36?`o!h(|{f#d>%{CncvyM+QQIYkJ{P7+|rKU zS?KEbyYqwRCm*w26&AELFydFbE%ECW;5(tKzxKt+$%)m8lhw-Bn2r7B&6{jDIM_Hi zSimb->|8AE^_*EO?Pz|z!EHl3eOps&ds8b*>XRGlJ+yML7rN@;U~0f`q-Vta(7=G3 z<)I#@0Si03fgX#V0Vg|)0Vk&cFE=|MhY|b3tG_mHp#NLz)(*Dj-`h6OXEQW6v@o=^ zw*#fY&UTgUmrnn;+5|=PTcdv}esGN7HT+_>hI;mfx4}dBWO`X{@Un2+xc_6yS#NN2 z3bLKKPLSz#_uCfOCVnkh=iE@GW`{DN;*nnlB=v&=@_mvF*A`-vvIO9a?mp}F`nE62^|9i3lobF8=H`k zf`o$c-~NNw0T(gO<)Bz1BV7f~T|`2@hy-s0sK8t#Dww@INnrl^hjb1Z1r-e)0}~4y zyrAp?a1IF>`5X!|Dk=(?xUtGJ#>sc(ap z^P#N|Ce|fl5>hg{YxE4)8M(N5c=>Mfi`^ENkd%^^xp!Y#MO95*L*KyA$k@d6k)6GR zqm#3XtM6k!|9~ffL6K3zMyy8t|)%%9VrskH`w)Xyk z!J*-i(XsKF*}3^opBKI?E^Tgo-Tt<-ySIOEGA<+l`Ilk+HnKD0x(JTz9103D3i`>o zkj^=Q2l7P})GO?0_@avFdNu@CIlM6lZ$+dO*JILfDs2!wwC%&XM9Vcpw|O$O?<4zX z1M~SGjqJC9{XVX700$WfoIK=<00cOY2x3S+_w)Em8Q|y=ojWir6_~#rcQDSoHE%$t zp^RcEMRPTt&7Vu{ii^?V9h>I#gb9V0sK}Ah)AE~;BbQM)Fe)a9IOtu z;^BY@cP!(x$-c?eoO>y_(%iXY6UA+;#UIf{+OoAdidwJEZumg>byuyBpuH07FgP#; z4RJ^$hXWC+(r}=V0lJN(p{&zQ84)|YN%eJ0*Nu+~;aaNksdI23Ib`}64%EN_vh}Rg zv4+=p`LmFP`FA_kkTYLH%4$&IfGBzGAsldlaZf8smIN43X*NQ8+B{Z1LJ_{@f|@yF z!+dz5yRffEX765w8RNDJS3H3ONs)(Rb#UO+wCw?Ur~WeA{=N|B>wgV-gNbANFh(90Uoy6retsqJeqJt{W3&%6-gNRS0cvhRw>p z5M^&3iIvhtrYC=H>~&Wt*A8}3i2g7Zx<>_p1H{UL;&6Zl`nYy^XATZX8x}+&^e_Yt zU?fHzchnx?CBcEGsR+N-_vost{4OgT*bs)oSi|;iZzrv3!-0?PaNtPWyzjI`o8iD?d1=_EX&8DB z9BAr8>{5Ol!;bZe@3M2){yy8==hGX3i;xf1aG-7<4(wGy5c=d$f+$mRgyBdcbgA6r zv<~Q>8O;~OJ`Hyfy74)Reyfo@I*Og@v_c#X6=I*p5S8Gkh<{mTKSlggi~lo2@p(Yb zS9;SkE{4TATd1t%d8AewwMB-Yb*CgLB*8v9!~?W+F=22(XGFJ~aV#Ar%GBxjqS^}? zo6PG1<+VGDB*dP48=pc}hGWU%Fh6=k=18m;7r(?$4*seLegA%=SM36P`MSU3=v3cEz?5BWk52O_sXQ^?(~C_*uP#LR{R z?UjcEbe}+TXaWcP{AR)qFyX*_P3@7K{WAr0UO0e_-9WWX00-J!pnGwU89irxm=AQH zjSUVEXwwlQb-@9Ij--`s_V}-}T`BXuC&sl#6R5*0*Xat#ct>fY+Ie!rfiMelSc6K^ z0f!gcUgXl}0ZBYV-UzN(m0rwS{tUENd^K6je!LEi8L0d25 z9b&3M7qyg2)XQ8zbE=t8oV7SJI~zUWmUbXnWyHH9oDT=YSf*jfqHv&5ZO5kvP_TRK$IS|CRpxcgc zIbIR|ac@avIDn}V4|cO@8ipMO2SOCjexT|hPVuy7UGLkAoiG?O)fOMso=oZV!Q~Uj zq?L5^C=Bs!^%BFp4%7`Vucs8cK?357x+J2-WP`ogbvS_91_zpRJ%^iNJKf~D@VcB)!d+V;o^BP|I+@&b*NPLr+_4 zU^`UmN#G*>2rm1p(};^f5uvL@_f~}Yz*z}s00GGr5Jg2Xob4@w0%*cohHAeUoB2Igg0mZow)(g9%7$D z5M=$IE|(yLnb1dE464nU8OsOe1WR9a8XWtXTA0~cc~TyTDx+r=_!pPy?vvV69W3&~ zg19+?WR^Q}*DNGTbEKQ4HTnLHQ7G4b8HoCk6cM z*%?HAY{&Ro#8e(^=A}wizN;!KPf$(?9ol{?YMD|UsX7{w=XdY?n*!S#$jFIhVS1NS z(w$W(nPfNaRvS7I_sF5oab#{OQ z=gl~J=pGOAH1{)MqTgD%awwYhWWmTeydt9CA*4{GGO zeRY&zwQ(!8U=4FIlmWT0e6u#7U^Q;`yx5JrTMt%of+(?3K2$2cL8GRutmos)UOST0 zGs~GU{V2yZpmQ8}ltuZN!$sJsQ>1QRCTZ`IE0cbg1y>m1hrLJL9qJoX#S0py{_PVh z#iNXk>Zul8@%5h{y!R!!%WE7JQD^}!M=qyVJ5U@m4sD)1Zc-WXhglsvist&*JF}wW zoYnM+&0aj)Y?N(z5|*Lyc%$x>lp*O0)=;ByO3=);Beb0N60&N^0&R9M5;9}618hCZhmMd;|as> z*y$(Hdo7}j>XXPG6j#&cqmH5njz|Eo@Kl-!>=`U)jKYlPQDeNoB8efGy2`7)0QJkUA0GFK8bnY$Po|{ zh}0X7Tp&uS<>k!1aKICty~w*$;agwT8iPGtWms{Eq3}7`g<9@qUh=>;`T_4?vptys zrGalOSDC_amv2a#rZuIPHPx43Zavt4ENQ#KSwVg)@vRB6aii`Q@188I))KNEqp`>o zze#))0>cM+hKaCax|k{%fZ(7hcp*qvSbZ(~@+%R3XO#T733CwfHjG%V>~sr#K`yi+`NCvo zWwUeKCr@xEuUNo5^&Hyk%spS!ns@YmD{68n^(>9l9e!`sX4J{e z^gmHo`P{H3mA_dxTUbM%r5)1nUSmLNQywQ{hS`AJAW_=Cmn{~>r9jxCZnK4i*TLi5 z;r$I*en#Qr8c7Sf)%wJ#&%6V>nnozzu~cUJ-r^4=NpW2tkOAB3?&9fUxdks+h9_Pv zU&65{lIo~bc*hgK)T(4FN@2^y;_i_uoyVPLhxfY0kYzqLl=K3l)Dxah5*tmSq|zt_ zXm(m3`pmW-@uGsOr69pBTP$1FT&1qvAgtrc?OKaE?LHcPQy~d!3C?T1+#PSPQF81y zxXzcyxI#ynhaL_LMcj_y=L*>wsJ(pa9NLGkyC%qk+p9_g%0bf1X+~Q~9TBvFsm>F? zOoW#qAN3ah1y{1>&B7x$6HpII;Xq$>(noCUe3tc@s*P`J&n>m?49Ju(UwohQ7>U)$ z)*7>e!h??}Wlnc*r>}N}+Z6O*4CkhUYUlCLk00kjwhI`?@~jX-3x#*QUuy4V=&pgl zjj)!%&(0RwcFz}9_Zs?TyCAZ%5;C7%4+kEoL$+O&U$#hVxqEWgUih#?%+GZ_P4khG znzW#5`e%ix=XWw_NXVT4DO@R(Z%vLwpK2d$GJ2HUNfH?<;4=Mo(@KYr`n9yd`J3^^ zaaQjZ1*s-|BvX=czw8xC9p2el6bxf#;?%R4Z}g`LBqFyQF}#U-KPue$ z*OSbB(vIQbVHVe}nnH(C%RkVtQv;30G?Ws~@g4$=n6sielg@U!l}vPPpUx0 z^xZ`;u)NFe>$y4+L5pkdF~=C~iVd$_>erOMc*pSp{n!`=M(wzOs$=)veovzX5&*ey z07fka)pKAQy-Xf&ahK^*g^Tc!t@cxg1Wk$pCkp)>j>F;J&AU%`#_~1x@uhD2#oaat z-iI!qYZXypIugN`z_sz!LOI|`;m(N3oq=3zvdLVM_}U{m(2_t}btvi`Fb-S$ShL{c zb>K6$9r9?aanb1=>BzKGbdEY#rMt18`dJZLS%Ep7ibFy5Xhjg!%qG*MU+sfQ zY@E8ZhSJD6RCV>ysN#olN+227LSG==1=v?WHka8B1NK#@yrA>(&StQBp4tOCGus82 zkRcqfh69WZ8+b=iR_CFk*GAyL?R>!g1Y{9)?JdAW%Bgn92B6!o8Ba`g&ylw|WQ98e z4lEknN78Sq%3q5}6J?FD82&taFy5y#%M(G+^+KOnSzWr$eC}$F=q#nA{GbCRMAMti zxXcIpdD?)U;a4S9llRYz1Y}<0tCde?(q^IM?R7}M8@8t{?;kqf>7?*MqQ_y!BZNFa z1xN20KB*)s26x*BXU(SAVO5()8jkU9c8w0_Qyfy=P(kgdUn}rttU7DAF7eu%;pBI|;>dRfne{_m?kSZM z;ITBU?(09dpiTK$L_<+{werak}E@@XRNqvVq|=g_i(^eNl1|>TSN+ zyf2>Qn>s$ba#m?3TgN%$0!FIC?Tl$|JF9Bj-vHQVpf z^0RbxXx5GinXM+V=bPy*H6o*{9b2t%_R&pnFTSjMj2-1i$=>x)<4AZDHUDKys?31S zb*_D`BT6SD8r#P&GZJ|rt-?laH*axzLf{(I*B34l|VzlC?h*%ulhbO z>UP34WE+kS204cWs*5Y*O0sAwS`W4`TU)PYLEjS;hVZFp_@<#svFL?#*U~&Y6kccX zGQ&?hS`8OP7eWQ>H}}5ES6|v(EFV!-CBE!@oh%gthwhRX4SF+D1n&KpzRk`Bb|QN( zgogb5jwjb%$KJ% z-m8}_qHPLDbV_MnK)S4iR0^Ou3q5K#^<@qr$opEW z#etS*qyAIL-H2D5(j8vFl<+3{XGI@5yYVppBlWBf>$|ZTnoUj?l=<@)_PpO~OT-uD z$Ky+gaYUv|qf`20)(Fk<4$Tj)t}?T*#;Hb-QMyN5+E#WzD&4}WhabK;ANgwMgo?;2$s}0Fg z?K8TrAA8$RA5(dVP|^`9ilF{D^dHr3aeRS%>$f^4G&4d73JE4Y*K%f_->lu}0P`$H zU4)7%cEA1Z$M4U)l1$Nqh(>_w5K{vVeEF1pBn^@c1t9OHa}W9jEg3OiW~wtz2TQUs zX4j)^lp`QoLOzEJ;rH9*%z)MfMwmK+cF$Wi|g>`c};AD*qYDdxYLCi}!j@IN>uQ z4m&e^<^KCOCMUFHnN@Z#%F@!CXN8iaY*X8RaqUIJ`@0rZrNse|ygno3Kg{0`>KRcf za)PU-p3WxVPAxR@l0}!Na20hB?(|;csawNf@LFJGDlD)<2$jG|KNT1;1@(U1#CyVQ zJct)mu+pHb{XSgG)KVFrDUe11TS9tY!GU{xg!d!cK2Z|vy=xdOrt2RFaD{iriBnKz zS3#E6AorCNNj9Y@a=QEp`F=(L&x&4ETJbmonfUp&Fe5m?=C~O$QNG$!u*SaJ1lWQ6 zMs_@Gp~ z`aQvL_DJ;P)}tmKwB2AD%*6_@dx?gZlySHo=ke`)JkeGrU z=NtLBsa>!*6zo3-mM*P@xE+k>YfT4%TqySp+u?btW17m7WpSox;mun{N~o@d#G<>R zgFb~uNLQ&fI0@~66nRfOuF!sT;vQG!{TQ~7{wQgO3|!~^0m;Z`MnH8&Ho31tZ%51C zURol_X0+wN#W?W6IJ!RgJ#m4kJ%13zFA0#pQ}#aTt74=s+KT8Z`d$z+f0kR_Zm|_U zYna!9XXd1l422&fM~IO81C1uMrOnZxS5;_|z84X0Ejf5Wa^`jYet_RR7*!+(+tH)bh_wa}H{dcw6(d z*=c2GXPq%uUE^c4k_e=FCsn3jP#l`7t|L1q@XhV1eRQ;WzBM)jE#Bl|FS@SyKd={| zS42!d{lR9DJIg9mRh4+CHW82Xj(Eea^PY7N-j4 zX6W)8D|b&Q2W>47r(zCYaAKx1FU*wDYj(7|CIVwW9ac+R&@vRdds9cu1 z7-3RH=^typwlO*(X+bU>(wUVa%D3(FT1YG$AK@ZN&}T?}Y(~=Se|xEN)u}$l^Ga># z(!tI#j@njgkTNFeH--BjK`r6r4dV`5ee5e= zm1g|9gFd)y+2Y!QijAQl#CR}~$-(DpBk zNhWQdFL)^v5%TiL;-r^#Y6}XmFP3lMSl)y*eAqHUe*R_?w>b6DLBLocOPNa{n*~c_ z`InqxCQ+J=LdJ}_BBWSgT_@AGWTppyIqq}5z7=0dd9bFeP%Fmk(rS7W|6ytMd(`J7 zbWtuw4QEo}a(ydxQyy}#v79@P@kTqO+eQ10;8zuk8iMm_8y%M_@{KO!gTv0!bi;5DJJnn@K-F7G_s0<6}qXp?`cXq<$XHjCMDnLZ|0|ggCq&8;- z)2KxlCamH0M9!!v)y}hG4GsD7EIzJL$)63!Wg}7emN4) z>6*)RzLL14d7UlON7ME`0scg5>#Zks;;cE!ot5U>_4_tlxoTIunM<8hYnaltMJTxz zO5YXfGWorsUWs_hSb*hQje|5l;sOV-cEQX&m@aG!gzkZfX`MZNn0L}XI~yDz5}|17 z&Mbr)EIGxorh`G3;DyM;5Gx0wFj;%fP4nZ&n0LWDW@( zORD819$^y9H08l)k)N$tXPy`cdPjwx`_{yJZ`fVdsBb)f`>84A>I$2S?JSzbJ9WQ1 zPf>hRrNhE4M{o9=9|Fn~Chkr=r;S3z>R_Py@6LmN5Grs^@Og5%Nqnt#OnbbEh=z2iZ2r2BZ9$L8D){nU#~~7UB_NJXp-{*XCz=4G4Zo zGr%tr#bo6vL3_AZ8jKXt#iT8u)Xx#+*Zyn3*MlLHNo zTSL?l$s?v|usnnl%!AW`nfol{=VV|Z2@XD`uv>1vUVdTR^4-W$7stq}#R10cc+(iU zkxsdn7D#h=$^26dvmU8VQ4X#-U|6ChP&OUUV$@{S_Vc>W(uBo7pzjcHN_^hFQ@c^< z&JI>m_8dKrg#$sUXVwN%Yg-l=VU3C1kCEqqO^XbNIDhzkIp4CTM9yp1lhjU4o$1TC(`j(#5rjPh}ul8@}ladzosbuVW916$e?*zm5MO%H1eSJkHMLWg&`9T9n1P zi}r!X(>(B7{Hm_ZCR+Zb7cPuq!Ucs+bdB$18vVODFVk)rjHi2(j=Kc2O5Am=MO002 zaUj}(*)q*ltNXpdWXInc@r9EtSV~o5S~}iFbwfF?q@GX6y-0&yVZ(PWS0Z_tg;3Ul zdqsynQqT1A^V!9yRb!T&;AkwuSO^2Es8;aj>h-^AYaUwqjfHOn zfnAUF*zu~r8<;M-))ImGhlc!hxm%d$+Rz{lWcuvSLy-)bf}^@u8-gFuCT-n6!HUdD z2SSW%(KFiQx2t*i4PW>e-SVp$G57Ti#+TH)57wqeW}+W^8-TI-;x9A~$;kB9O|Yip z+p5FS3Ft&jtqn@LxWb++=5O4C19-4W>Q_OG-48(TcJ5t@V>y}O&|Hc`h2JMe{vw6D z5E-t+vf2R_tBY7Hjn^6O4T%9Z2mOy!pyOo9lQCd`xq6{Sb2Fj(S@7Ius$2=Ir$3*$ zVn4~)@9K20<#@6&l^>w~tN%nMZ_?dD_l3Pzp*m0n^LxAq`IIbO@@?Jh0k&OdXpru+ zTc-g6&Lq7QtfO*>?rY8TD)xXw$eXd}eLUY5){KR}rE9JG8AN=;BfzA5eyymzI@DUY z2M>87N}C9wIDsfB|I6_B&U5p^%O(R|p@xx|Sp0&Plq6IN?dMItm$Y4}{l>oM3s(5n z9+E+3&clK1utusqO3+%5{K72w!-2t;S-c}$IIsdr_AxIk19AcS(FqRd{~#5};lMqr zCy)&RuqY=Lc47M9`H?7CLp*&P@@q{ThSl*MPil}#T8A~4uyKi*&a!acA=`QPexKfs ze#f83MNeL?X2EGu`>pY$sr95;oad{p*Bu5?%qHvs_^9X*xzw-8IJJ9X&?Ws%bQn5x zhYR}tbfX24LBI*Ob-MeY-8tQCl?($i2+2-&U-Ibm;1?N^ajg(Kuhr+yZSiVadn$c$ z_0!M?n6TuL{D_!~jrRQ!G#V?**H0(sA`vm%&J~_-K<4u8eF1QU;i`Sfu|A@i{zuO%+)6L435aN;t9o@lo=NLQ!hhmw2tJ;wMxg!gwJwh%NqV*W$;a zy;Pv7y9P4Hvt~SSKuwr>6VE^Ob$^+2Q$fZEfwV)WEY?+zIQupu1>vt*M`q=JvRG%f zh3pQ2M=?$Z5~cl=Dr<%&Ty5zRk}qCJ87kq55`Fk?WB={$oY+}J_4#3H5k;DMMo$F9 zSltb0y_(7c^UD`95B$2BUY!^`6>NVmm;^i zrI73xFQ9F3)(J5c{vrtW!rFOTQ2m$3m-j(N=S*>SR_NBZ?V)~h&RmlX}L7E)s8*RWkz z9P;t8IZ(`;%!j=&bAF;|c}4nGVh#y%*svF~qBtP{9!Mdxh5N`LkD|wfcgz%2ZieV^ z2iZan*ajD44{IPzZ0%QmbmRnRqIt&VN@jm}q$o)sVb0o>8|k?Zl0MMs2cASJ>Q#3m zj$`d|WEWg&$B8qR$!$v5Us){oeCYOAmiZ;J`C<6azAluR7(yxc9PfvW^UYM_&PZcN zhmi`E_-daw(s}fGpi#r<`4t?tNGA@<<{swji_-$NGQhxTTXgn3&q5U@p^Xl!0*Rhi zA?Cw8xnLbUD`*|GuYuS{;+32G$Y=YRcf2rC=pysj4_NbuApX>Ck;xHD5lhq%6IJYY^A2y zH~9sMZ^unMjC%hW^+c(`KKa-qWjqfFmF!MMH=3e5JG}P_PkBF-u=;U9{ z1UXd-InttPo&xE^d5N$HIN;&Er{edQ+CY@#lwNOFuz2vay@NaQPH{7P04^cL?wrZd z@~z5M4NTn@&&$zQ9Ygsnci$-8`lR11Z{CY8b~(&<2=)Ib(qs9lqzNYmDoQ;`|}kEIR{gHXXBQn-d)=?<1bPje8nL3F|2qZ z6mr4ruhkvrkWxcnQukhw)C($k=b;aYRIcbKp3eDLT}A!E4f&6%0upKu#b-U@Z9c68 z(`$WwX;k`0dhe8FII$YY39lo?HhDFJt4T&A2gdFvB5~@>doNi-u4oe(H{?q423pzM z5MZ*fu&l-1*?6z|LgYvgv_>9Sy??nXf2>+ur$73syk$ylD~FJK@@hdmiJK|5V|Z_o zw^xH_OHEFjF=Vnsm?R4o>}^5qOXU(Z#AxryI-71ECHFfl=nNc~NCS9X*$tj~h>z&A`f!?><%YI7)h4SpzzM;25GfXT0Z^u(9`;ZQl_Ye4U+3{rxzAlfa6 zf__O=6nba&mEU?A499S4w_{Ff`ABy7|@9ZQ7UNX>AgnBHiR91pn((F+%XuY%mGWPW%gyxFvI-TycHiw#IC+ohtDS)Shw4VvL4hdM@`Hlvpe?EK*5(!Vhvb@nWon> zmo&;|WxB_s+wU$(VyKYJ)*aEHZ|2no)NWk`@$AkB9FTYm*gyNR4M4@|i36s67|x@( z=&IBXV`Hu_g$d~q*nrK%)ynvuOH1S01+OadGdpa|GRG!Uq!I{Azqb2XYefRLfq8>S zH!ncIl_}J>v8rL2s^*eJ-J{q`mzCbnYDuC*229tIwgVDV`#q10!aN+A1&Q2P248pN zredcV(W$3bxJ8bxmd%a73u;tAH~q~}5w-3;l@Czc^G;bD>DM|AUv&Cfs-P{6VXSUJ zq_*0N66~$}iqiGwJ-gZG>a-SA&R0Oa&c-*aLDWmlenp3sQ z)z;fhwh5bZn=KVQ*X>Szu8sNiz7ww^lPryZg=Qd;s1fZ;0G+<6eVU6f z>2>y-%_J%(aoWHjEi7<%ZEQi)yhr{U_De8MIK6oOXU-T|ppm&_CPXon_D0FG zY@K8f%i5PX>&hC_7MDDZbd4%fPPnyd&NUI=qO@#<-G1NUiYVVP!@$}wSZ-HVbDN>! zLRyM+cW*l`L<1=P&&|n!PF`Gkb2|R*zIg1CM~yGnuX4GE9j@TLFJq)oWo=XP_D!r-2Bj1jVf4_nd!ck ze4hU-9zOm4zekdsBp2Av`rR{@<#&Dq%%GM$|0Ru@1d{=?Yu=X7ZFeFti3&N22J5rV zeE`d%_85?+D5Z%Tr&x?tunvC3w>B-a=Xqz=kDkOqk59aNp(1Y}_i~7vN>RTc#LNLV zo?pZ`UWuKU1;_Sy`g(EL4cxc61a;%FLHFt%nJi{HNFQD{8nL*a0;#c_l5SZLxf}?l zrN`f~fjo{bh#Km_z-5jL`e?5f=H~$c=@WD~5PZUg|AULfm=!ly8^17+caL^f|%QhM7_6CY`r>guDVK1y&1eXcKyjbpVCo;=uvZ)I-%KuriBj z5!}?q2RSnG;*Dt^qTtZHl}E>Ujt1C&d_nhk7L#<@=TS&fK;BAvu}N@V`NcNMJj=Q~ znR#n8h@Xh~wvIqt&)?kkq@L`*amnYxRw^Q{3sNXw#=|eefp@Rd5${?c*{C}aR~TCQ z{F@c_sF4uk@f_6zs^ddV4nuVmk>++ApPTb9gKd$%Tq2VkbpW5P@U;RCnAFIZSPH(4 zc)Xlw7d&j`1({cnKRA910>NyvmwT$YW@H(KvnoTyT-UkZlvfd05wJyv3X7wA;cg`J z*rL0BIYI(+TRzZ{)pc03?3q%+Go^qh_J(w0sjq8RbCTlrds$gow~Q#k8_}N?Ab226 zG<~a-iRU~`+otkP$%65!qss6*mFepFn$_x?3&Ni4p*)A1=?FIKwEa4LPCCqAHEqV9 zk$8o{em4Yrt^0U0U~z)9$z<3eG`yU@J39;WX@cmSZM;p1fgb-Z7-Vss_WDR?;`ls- z;+NY_v4vkk&PizI(&E4b%G3 z#eg1f`-EF!1ni^p@`hgRxFpcmW2E&h=c*1quh-6Jf6?7R9jx8<2mwq-L00t9L1JR~ zGYg?PiHFV}Unumy;4*R6QEf5MAA3%LTLkWxrR$}61ZWI7;0Zu?o;Dux%yo>B+^t;T z>oVFyhKZw`Z2Fo$W{f$Lv_9>!em%cAah(=I;P9rSIK0r#5JHzNB_=!PB~I+tg74Xu#f-h8Zo#3n4*vw&5K&-YRtR}&q|KWxJRg~}#- zogdFS4DE9=uFo(aV-RS@|U#F8{KgdjDC`uwy1=ZXB3{LaUn@N{;>`Qx*dnN*)AO!TYjS9J2Dvn zL#2}KTv-;F@z{)1#TqF0$d!3=^9uYSm6EE3!98Xcr#(uhRnz2Iu zE38uB^uF+WRKy8JMLugc>$a|ZbaN;O`fEO}^X<_1K%=V;$huYZb$^x{z5dBhNMOOi zbl77!7PY%Na|vIjgF6mn8Za6HurP)8#v%Mb@0pnRbQlUCG6?_I2)VOyk2am19az6| zuNX}5u=K#fe7v|yCv^`c?+-H{C9xfHEVAsb^}MJe`P9w+YkjtQEgp3KHkh$lErf-* z{^RBT7pnzvk%AUw8r%`qTf2gt4gGRR1~~d}ox~jlor*@~qnIB(XY7Iyy{=M=itMER zy&|<2a)m`6oTPs^GOOJZ38oImlp4y z_deF2R6qSmBgp(MQks;;_Xkm$x|266<=%|FzLDUzK$=hX=PUXCf9_*BYi@PEBN-y& z5W~JH6TO7nAQ>Rb>$hEQD@)ENO`k1*s{Rj&j%4f~F_XUYzf+~Dcq+C>N=jd9%h7tI zNc)}M%aiWjqLFL`VOiY~)2$Nw1e!zEh5OIsz_g-?PJEt4b7ym4MIprQ=5GF9v#U&r zL&?!cPBV*2^d@uu>u!FutSW*AJ6-nNFWhp=GM{X}y>W}wDm9@qzUW>Dma9|u(*FwT z{O?yP_+Fwia>(j=)}_|k*qtXjEPLIP z?GiS7eHmkLz<5z5M)Rnr^WQp{+Dc{nFcBS!*FA)uoune zV|c71<&_+fEv+GT_Ex@DU$Ffj6gao9t8Vj#BxV{3-YS z8y~K|tD!~Azm}9G&BQ!x%F#kXgG<3c`@f&3KjTBeqBBI43_LO&moYtv$#;${DNnbJ zs)~3|1d{j=jQS%pw$ntx-Hkuv^Gy+4F5;G&6N2K$!4&`Q1e~WpM~T7hTzxy-AXnjW zvd!%l=-pYfSy1 zz|%hon+jpp!qcz%@-BNosv%Di#;Z>uML&uYM7;P zmO3%#dE33?=LPLM%5*6;#w2sm=6*`A?$j4wjUq9FwZm(y{%iRtoNv=_#P zLJgpMV~OtY38I-aH^$*;pdsn$dqWR+S@mh9QC-+>E1iEE*`ZM3V`f#R`Qnv=ahPig zlfMv7V12VFih-TVx}eg-;RgdNrTc5~hqp(y_!wUC9I}lgkv@iRS{p7hp^i+zfmn&H%dLt9}!1$a((c6j}8ui?5 z<9;-zKKnMlwJ{ItaI7IuvOat9FEPCcYvCa#vzydVpVAV%CrHph6@3_^jO!$&bsKG1 z3HNKlD1{F){hoKa7!E;t+4jy?4UH+%SC5H81p=;L5`8en%wBp9ss%W3sq$LQ)@Lm_ z#(6}S#_Y;FFsmv|W=)=J4C?k&p^o}|8wn*?I&n0g1^b@IJ$a`DMN5l?m~n?YtJCDs zw8*_Tkh~U<0QUtvL(h|TmeK1}h) zYC7vErDkJcwk%2{IaVAP=FeUcf8$4ob=T2f;iQo8pR*$F!ut3*HBrF@)Re2}7BnPcVGjUHLtt z5&|PCiIa$m9E_;=!Oe_*f5M3U#$27Qm;3K;ygk`~gz#)y^WPu11cKpT5`{#F><9R? zfm2j5A=1AIzJ@ar(ptc5QvSb_O*)e_AwrCvz#bv`1TJ9p{Ja&(UV`@XS6voG1a-&n z7l_2_a+C4p(08N3iGL2+OgRADnWiQl3-$dxZ)R2J9TjLBXS z$eU~)k~~M+^k9#sMVPW|)f09 z3)1vJGXA9wMjL8aVbX@wPixSSdcO8e@OCRrA?-aV!b2C&wt-~sPGp$ghS6VGxRT#1 zLR;>yjCu1h>aF=~Pv!eOBxu+^xOeqSH_##sGr*c_x_-?zE1WwyOKCN7RX4W?FEWPL z-dHZP#YKf6J|Pk;cRT%jNiWPAVk;=>?6O8WER&_{Wy~$pPO0A83oOO@;tJAO($otk zt4+dq7~-fcXzJ(Jj&5B&ACAPsxs1!1lxepMcHAbc$;E43EKLH(f`6DKRL#gr+ArT*LJ zS5NC)ZNKblcr;CZ>Yt>mDlH+|&GtpR22gAH$*oaW#kV!_(#;+Q8_l&RP=ey_EI<>h>INEi)AL&zA?9R#5_%=`xZL51; zePsQps`DPHeTUj=Mny$}{>v7+dPfFT_Hx=g!QnRbD?;)zLo3|X7hTe|^1CXHhR zz{)b?BI6q}@k?H`IVD45ijk1`ds=j|4kRCu9{vd65Fb0FHpK`B!Ud^z@Qc7y&6`}K z6nCpW&&)fulQXdEo{GPvB~EgLoc}t$QL&6lgBpHViVXad3j4oKw%Cp55kNv~gg9=m z5-LmvSf}L}o)jW|Je?R7jREW1uUP)VQ>^!UaeX-j?|;DjAFoV^broPeWe&)lcO-)w zjiqb16|)kjx%U(JtU};`zwUu7kI9dG=8xb1+3Q)KH+-gSDaHNHV$#MHkW&!(je;$( zgzhtfl}xB$O-0`Zxc3oEjBecrA83dTQj4h{lhK_WZxS@VV=;yI2aA2`bjU> z_&~6%5HbR#rCony9x?tE^Y|ZzLH|0!>DoX)3c`c~x)rqt$}9q6F67O^^r}V-C7R|a z8xZTtCf?K8g3^DTqWGSsV3{p@1I2gNHlGh=@^!Gi>Y`AU>k+AipX?*yX5e9#efD_? z+F0bWR0K=>E(F?-OpPrZ?6S2k=-4oI=J+CG<>);mvQBlnGyiNu^~lW(vO`u4N<2FK zgzw1smwZRp>5HEs^{WU@T`MXbD$HB|BzwCg2$Rg^C1d5YRwBt-u=<5!xXHFE$%0vL!%c3 zKCTN8j=3V07TY+^tjal2o@s8$GBhrwqM&9@Y7?fwA3D@MzQ?INkRCVNz0mP4MlvH8Wm7bhQMqviXTp`y1p?qp#)N&+=Xktf+6Ey3RH${lH)Pz5x1+bB~fOdNvBqkPv61YiMrPotSZQ zY!a($WoG47cZ(|}ES~o$7dXlX5XW*zjKtn(ThN>kwa<32qtI`gvrV&1*~NJPnG^)4 z%S~!SB3h4Sb+RkuSzJih(X*1#DN)ZpSrjYE zn)c3D>M_*QccOaS$yfycKlaW#D$2cG|AQbXEz&KGbazXMv~=pwFmxj=NT+~wcPQN; z(k(4Rw{#=De-FC%ez)#;_j}HJe(RjG&L6DNwT5S&d4_qu-}}C=>vI`q${1r#R9Bs# zu#bons@;EB?qbKT)#Mj3hdZjxF^VYap;fxmP*NHgcT!@ zxY*}Tg^y`0D*0rzrr5CGLO8NVWC`wLupf5eF}v_ts$+5EDcDVr5_yl?zwar|)1rOG zf)^w4B6f<&bDp0o*EM67ai|#TS-pYn7)Y2+Zd@z2>J_l!g%ENVUQ%2Ch@*ca6@_Bd zL95qqR8*_qIuu!4n&r`cg_CL0aReWy8z+kSQKDL2wP@}$(x^4eBG0`ch~ zqgtcxNyH}ZT_237R>e1$LB^*PV~_MSr`|Qh=t_FhriQree4eW7~jXNyh9@l0{wJ^rY)EMU#{j|xOlSakpfDqaP>F5Vk40GK5CLe$8 z&;iX}`0sF%rQb{T@6GBqXYiW8zy!J;KY^;HfHmZsNTxUs=u(=PI;o0ZHdl!5TXi_@ zD6xfigz^qv2+35Ip{=^7U-6e0`|Q!Lr*pHmt-W|S z01Xdp=m1x%>(_^ioH)C>sokiIe-=G~uLm1Ae;z{|U7P|_h`$~R4%Uq@>^Ss)9q4Zj z8wPzH=uZLz{gLqsUH!W+?w_>E}g zXBD$?rIGW$Fuz~D6#pS4rMCGybd(9qxcr0DWy>PD= zM0W5+mM^H&`@mx*nPOClNDzfnMAinFPYMVbiU7WZE*uu{)+H_gd~z&619oF1LtJ_f zD6*(-*xu zydGso^LMp~?zCB8xR>pto^FypL>}4O#Ts<0!!80%E_s9L-V3(95Db*(0@STgoyO$X z`#pe@FqTzk@focyjDh-$8lcT85?t`&ctM`mQg9mGRvoJp51DndewnX*57A!<74aPp z9Qqwn-+qUfRad=N9ysdijTI@lWrq(;z9cI@nq+UX@L`^p#-)^bM?!;G3ya81SGE@$ z4gYE(&wlesz=H%&2H9F)v-o76mjal^u%)1TEomqPG5b+78{;Ar_dCiYmNMy( zeb4YgvA+~V-^sF+Qsobi6Zw7uaam1*V}+P3ovbDY>^e9-Dk<>&D*La-l2|QMMvRl{ zrKV~OT|PS>BeD zOoi-Mj7jqwW{DLHKBLnq6tRvSmOr6=f<(6s^;f8e;hV@O5(k-W;DF@;+ZG;DFwpx< zTXOvP)kIyIXBt}_pf=wLH>w099dmimowZkQ=6yy?A4ceX68Ce{T% znwm(hP1+x?Fi+kqZZ`0c0ow2$Kuz+do*Ze;Kj=@`&~8{Q41|72y5CUiqe% zy`qx?v}L_+$#(Li6fv=G?D5Y-?g54uPPhFE`{Oi}-z_q~U3mVxFE}z!#sEu&gY5Ic z?gKzD#27W_v2~W17N)&K=vmakvz~ICxcBAyk*v@)6u7%i6wC5ShXb%0t+ubQn&iagnR@^+=8Rq@#W-HI50?j`^hnwxn@1f#9Eu2j52 zO>vfSOb_2h>L~*EbmO6+Ga}k@V}0foUzxt9p4i?YN|=SJ->!>!ukcLilfW5Obj!p9 zZ=8SB>WMOa$HqEW1VT?7#=|fHEa6KUSZtv?Y|cUMa;qQks38V@aSRo;Rh$`|O0L@s z^|T{NOO213NSaa?V&ePl8TSDA^ENYp{%@H8nbKF~m;3*Kow0mSkq}BQPL( z;}Q=Wtya`<&xPRb+ilg2gPEgDl<5)rvT(}G!>(vVJ3osg#-BiPHoC9GK`z0kOd1J2 zGHzNF??#&j-H2w3S933)Jn??1AHz2wtxD-NSq;k`ca73qSJ}ub=Wnm2QL=3uE$=lI z%}Z8e^DY|O2@_J>^6731KadBnEV<~;I!Qr>msVqXpTs#o-1L%*WT29k+AZNR>O+QO zwM)$_RI(|tu_6y59h0gPTY3I{?FyS2S>jRTpFs4FBugb!5)qrpmMpiPmu~TsrfWFeW!zjv$b**kes*r>7fBV{)J8~}6xeVIaFPWwU#>*R{e zoKMD6kd^%`q>R~GJM50ZSscSfX(xx3>fS)5P2nbzagJ`FWu??x1}30xfs#Ib1uw;Q zd1}(#5)$p*H6JdM;l)4hd1ph&q`_TGEL^=h`R(uuGhx5d zT=uf(B-}n=4Ro1F9eXC#sn{V&mOI>FzA&SS#Aa2zp0l`)o?SL8F>I-iIt?4;(m?|o zHvEDo|I}Q1C{E?&^34GGj*d@y7#?sz zKc)hzG80{bB0xLvGlYcSp&0*HvBJ$Q@5i4%t)lAie^q3XAy;?v#Ut6Ks4I^&IeEN> z$^Av3^hb~XJ$#)1R3F0ETH2LD3HUf!3pW%oDfF2yh-$iym+ze_f2W5A)LdqNpyrbN zFHmzi;tQ7o{%YYT+8ay+ucyM90OkK$(vm>ocUtL+?Yl{*o$ZKy?bzm!v=oFL9PXTd zMI`;>3J0jlekihFm54N`ekb+9Jvl(TI-+B0(c9lH0!(~nyMV_|_4QwmPq@B&_6?Eo zkFC1DHbef2;tjnQ3|SPy*ocsJDAW{8c^+^TryPsv-bKQP>4nDqrAQCXS#W&mLpQlu z-6BclObPi|u1I^IZ<=L;-G;4sdFe2Aulg9r?br2YXauk6yb{sBn$P+x-kwT%zB>*) zlHSGI+BS0ICdUhtPB}S}vZ>g0P!RUs8Id)`JkQCL10rA+#e;v?_-^7{vu zfZw;z^!C2{sl&04(#@Fb<^5@9T zzJR|8czY@&doMLTKY{`L2G0$CqYz(KStV7^^g-NHE&tK&@$pYuyi=9I^oEmVH5bKn z7*hHhI8`V#4iGsZxFvpT1=i`rukJib_zbNHrtz_ zbXEG`TIm72_XD)&mg$Q|BP9)+!5!}oi`t?^siRCjmf!7(e<1Ps{)4Amz4yWwq}6Ms zyD82+lK~cz`pFnCabN;d{{>@^~@}% z1^M$jf?Deo;cdF)j)7Iu7@OrW5>V7TGcBzEXlAyw{W^1PtFd8%?Bk;e(b)|;CoZ&? zFWU(2=vl7TLZ!~CsHD64p!dyLP8WA%YTl9$m+ap2J~-)`AknXCc?0A1Mh#E7g1cp~ zSD08~4(9D8WC^KQoWtnduzo{BXo+EDZcUVUL((%5L2v2ju1WJr6K^-`P)hvf`{6sV z?hB-3W(zYCNybx6<*C^S=HdxydW30skT{2=Kkz##5h1cWiT^x~#MQcsibGM_G<=u3 z#AD<($g$#Qxx{~B?Hf2%NvYJJ+H$8M5 zpojj8FfwH<{@+^aA^e@{jqdL+j{o`P?rzp&h6c68+MOivThf*t(x_u9=!|mmAk?G5 zS8SaQ^8wV})$NosOXT1@E~WViw#AN#NUp zqq5);<>|P*iY{eb7Va?G?_!$H8Ah$HM}#uQsFc>FnL7-D-pCN@%w`nN~%?k z?WjJ;G;=(;Eq#bQZsdN&5}s@`H|~YKdadqofrRyxMZ1-)mUQPfCz#~R&=s9%t(F@^ zbE^GZf82r2?Zn(Il_9-?8A4Jw;Ndv9t_uJA7bze+_M8xNEq#m$-Do~pwSNlqD9sC} zi^L>Gx3>_ZSMiGaF3!Ouyi3i+_~KQ?7Ez(bO4ZFqD*4=QWu5t(vk6|m=^Uup-4w?4z^=#ld|8>; zA-XvCbd2&LDi@^g&C*e3I~Q1CFE-RUPeI!(K^t(J&rB#Jc~r^@;%R74nTct+X%!|e zZc$fNN6mqooLKZYd@zsd8v>EZp`t?ID<*IfHYV&9LY$A6%?W?AKz*o*&Nb1i;83Z<&j2bH7ny$t}{ zqJho6X(F@9xe^{f)p-!Hpos*kb2B$AIVhHT)i_{{}cW2 zhhabQG8unLu@WsC!wnGbe1sjfKfhR!S#>Oe;sx5|+igbUr#?86ff=#vpi*00^yMSm zPS?*6`%unyaxDhI@folk*`2hfi0zKCxP(Lv#v?%q1aw-SOj{=(+gIr5-N=zj)qUQB z(xRf#%+p{la(-U@6aG0PVb zkl%Vc$eK4im|vvO*-D{YzH}YOW<731hTYf3iZ%pn97lWb#=)ZeH3c%E!J2tB&VKJ= z@?*OAdqubFDV8)6@E#~akgB?b#<~aOa6{W7%tt9d9>s6#SEb67MIl-02X22X(%bQ2 z7D6;=A{sIt#lChY{-D+VP<3Hjp^KTBxy?8PSpk9E^sU*ecHWXWuoDDU#?6LRHZQX) zAW{o@z5SFovah{v57ye&M)1`VgQU(uiT6mwlmRxGI%72+rTI&VGZJgq-ED=ZI}auC zmI~{K?CVdVeA}D@E5z~~u_jopf}A^~VKume+RDqrM`u>g8e%&pchYo9? zgh8;|)r~@%8=4;egwDO~w|yaOT9B`R7v&d!PGEfcigOS?~OC4zU{7f!%-u&L>@LNyn*MI+Mg<{VU=T<0?8_3?s{HO>p zQEx3Dq^K)#?uclaL-sDFWTF%KUH=$*O`W#X0QT4Py1 zlsvNKEP7hE<|7$p6FEgyhe!h}q*ObmUlt_GB*bS7UlNAO6bDO-&%lNXRDNIiJx`#uHV&7qRwU7qnDqGvzL^bcdux z!pG4P2X*?4Xql0;h8m+=QrY#)1tGR#78ZxzA65M@VdAo8Hq}_AIFhNLEtn{wDCx^#VUH!HeI@Ol*lWVlSS(xe$jay06Z{zb(IH`z9O?Pm z8}Bs4sp4`)T&(-xB4r$(so*aAf0|r_O)Ca25tDTNc!@!TIj?M`4-El6!3Ym{`rb;3 zkS0KH{L@SDnI;YS>hYS2PY*47BQH{~zdl8fRykr`Ck1E6AUDx%$v?XUW&jfRsv~*K78 zYKzmgKa`5(anNHmjsUeG&okq_FI43fodnoEX=QN`0EOdceg8S!ze_v!HV=v-CR10= zsGu#nj|2M+A}E~;404Uv9jiosu>HP#x7U#e9@s7It+vv>0f`$FY&Ij2Z`LCM^?&IQfiGXQ@} zZBca}PlNz)&MyZ&y*5VC^ostt)(c_=4%~pl3n1Z~7dH$$|Jvb-68=RN{}Dmtf59?g zW_tcq6+gDniLhulZ#wIMw&PFq2~Mw`NAk-qcG??iaL@#?;35llTCxhbzlza#UHrM}^~0)BtIW!9+3^Ra zY=MmS-5DYJ#<7MV`&=^*%Ie{_C>3=c#nvriRuv=J@jTnLPeVS!_hY60*+H?C<@Z&p zGTn)aTrEqHq?4rWa%3^Vu>9pf^$3CtsY6o(AxDL+5XRI(ZDxh3ZT58|IX6ocatD(I3WWz=yh62$4AFQ$Lz{jvdV%we}=|rUTx^ zNCDw-@5C{jRe%T9J9O<=GV#l-Z*U)pRK|IoLglOMgmEn52ivwGGF-9j?%a8Up!m0T z;T{Ofv`vUWNGZe^2vzYsXRUlN7G-r`_wynZnyImsz2R4u5we>L0)S4A`xn$Ezch)G zKemSBIj6mYG{J z#vuS~ls%BXXvJI#3#gkLfiMqwvws4jDXO2**yfkcUiYCiYzlKSrha|!A+qzuPVr+v z+6*aim=V0z(6FSxkv6viUpxPBj`E5)7*uz7 zH0Bg*rI(dM9;kzZVfO&$a@qCY1(f}bnZs>v_L}2x%+px9SFv0^t56xOfJ8J)VA)Do@fSpoqG5c)I|)PSj+2f6lQh|`VG-fU;f z!J%=SLssB94HN*D^cn~rp^a3r1-;)(iMJ|rMuC+0f|%YC^N{oDQsXEs4AnCqU%!U= zq^J&+%eAgHmKqNVm0)KgEa1#u2E+C#ehLZgy`%_hm!AA{+UE~98K4;dA^dg3R|@?! z18^ni6TUAm!79Cv@PHFxPwIUH~8MLuZ+Pr+CW2&=PNP zV^$CUsW<$**R4WkW2k(e=$?QJ45J`0);9cnpu5TI5{#o3`S$z~OCbfuYr+O!M&XOh zd{usA)tEIO_Qcxw*V9^$HUWCW$|Qjc0*g%;=e#~_7_YMNo?yH{YmafG*n=8m3|m1N zf3+9{JVXtjJf9COSC0#SUTg$QqWsH3EIM>ss>iNsJU z$J!DgeU9T_-Ws07ulmp=4<+kVv-_I)yyK%n{GjTsDIcj+L5Q_b3#mF{S&2 z?@aD@lRotI;R3;Q;pUU>l_Xl(7|i!W&k5|d)W=NHcc9l-t8x7-Z?&{wh2?)F$2BY4Ea3g#<=yI#3<4T$c%Sh6@Xp^7kdfDCyPUFG?Vr zZatfL`CuY&HHL}nODCKtGEL!C`upl0vO7QddDcl{ltcUacR5J0zHvA{M6eCDH zMpU<>^gl@4-DsH$^L0aqH!Ym+g~70F7}Z_G2~DeW%V8BO)p$y~9$LoD1NY7@Y2WLP zy%nZl<)We$CggTaS!9-vLX&}VCr{vLgw%ZgXDI-C%mCOrh6RcT2n28 zsSm1a{N8{*tlPq6VTe`lWWEWYSjxWVuo;6pCH#B6@KhNNv%N1=egOzq)ld~*+3?96ZXea>fpau5K+ z$cZrh(vQ-~JA%)?m~%f+CcI2KW3JO%=%co+z zqM@8k7l|&<_|=xrd_aaq`6@*3MUpX}UB|=O^o3pqiRI~fd6X{aFhb>cEP3oJ^~YYDn~JlN{T?t{U`vJy}{i=2^$;2P{}zU0u0!0|_ct#s%@FA8!$ zyVwLv`BbOtoYZO&+93GHVL-8BI+3uv@k9&N$|0|oH-p&pQ4WL#$8r4rq}PBkvF7{yAA@6 zSF=1xw5OpOdK#wH%s^bU!|md(fU}{BsttAr@#C#PMAQYL$i%-g^AS8oaNP2GjXAiPk3H@|#5B-cn4j#+pT zlOiL|z^-u^DNWkh?5v%y({3$a3U^pV%ribBtQ8zQWW&(;YKH^MEtF;3Q7$sGK%(C- z#>H0D_k(Ye!w%_QaZKakw4{ymy=9k#Pjaf{bopwwnS@DEk~7`Zc&m9Ld%IFW-4N=U zQKkoBLtFDQi5ZKtT;aVC-!wk%?rvD_4O&k_S&neAdKu&ct+(B+A|N!8XL;;o^zHys7iThyo%dBz=_~nQR=}c zG|XShU3>B1&6_7Jj<4u8LkR7=2H5&p(cspt#gTOlmrJ!Ogp9(p{0+UINAQyQenLm! zp#a^TSAZoOryM&@=ADI-ls3e&>9X|&9FSpPFf&ULlsC+$*1&9P>JpEUXnbUNYa|}# zh(h@J)x)w(Olvf2JT2m}c;Y~-j7?r^AZ6%jMU4-i>CC$!OEm=o1Q-G{?@8@r=xwvl zn(9OLeC9CJ2}883G9fNeEcCl!Q*TNyO$g+AR&VGlK7e}!c^5sF7_Wky`CVv~QT@?$@h!yZ@|-EmSboPyMSmKak>A zosB)#|Mo7nR0`ETxQ?|b;k7vKKe6Wjz0LEVyBvOG(flEwOs*4f?|nl~e|7KujGWf? z^lh+N5MXM}8C2dE3^jJZ+MbU>3KgZ9VRN9xQ+gkEhodN(r{krMADWGk-jZ(zNV6&p&Yd+R zvLwsE{Yw<@O&=^TN*iHJ&js))$@MEH0GvKQjCTDn{8arK0U)^d0>0T(c0kq`R16_e zd8IL;v~%0Jo08IBoaQnfM7r@Jm3Q&_|)QoOB?~ukh_Pm*ge&Il|@9sL-B@!%v`& z&2Lv${s`@CJ?=>Oa-C@lSYM3+e!9POi2#cfb2eM4zz2Q|KjH)X%MSP z@53^IuYzq^1^r-10&XtAQn4U8RL9KeB=u9m;#Fv*6JtCd_Oy4cLcDI{`EgRNyd8nT%`|IP(rz2or!!1zDGtFI@=%H-Un=ALDD!zH)b#Hko>;Z?203aIHnD1B7<3Q-N>eQ_l~I zg}_+^0%!3PC>KDCTUJXE<<)grqf@equ#|^jn6jQ z1lY(n^xq6M(iT7zi~H;xFq}7f0c3AR87?$mz-s}H$I>4oBUIe@E_6h3SIU#Aq{*b? zOxM66h2T6m`+ku6&;8V|Xs4o!VooR!=d`;L6T1k+Ib|X2MK6#%NC@Z(2~=`m9}oz=rLaU$6ZGg)rM`q*QBpB-#1 z55VON&RlI;1_fAziM_@3Kl83;dls7U8dc_MPU@&F%x*6)+@cxZ|i$6F2lUek`wc)PK&)M4IwQEGyx}jAoXaqP zc)OD><;F+LUBHqfK_NHLb?)D}Sik9@IRGBC{z_^36v_S>TQUFx!g; zU+En@X#j58`n{f4*tD})j1Fk`UHk&@TW`;-eOrNkOwY7>HIdkNf6--=6uy`uEmLOkawy$e5{7Pd~1bDp2X(+sf2 zMOF(Y;e*C9GW}PPLatIwR;DJv{+%mI3NYHQLMw``6lk{xDUnN;- zz%@GaDLw64V`XqSQb0gRH-*mT7n+=>1}rvKnLe+tPnl%YA@@-@>Al6Q+H!Vp%CxK7 zgYM2cF~uwCQs#C~l<6woXQPzQD00N5CJmJe$x8JvkZ24kEH9>gH`x{7(R>*yk@Qd` ziHq5XdslnFhZ!to9onz8@hG@ESZae|yj1)+IF>Tf zmZ1BFOcluFbF_7lr>7+Zxb=hkyO%-TKx(Z3-%lW!XT>sqeoIe7Zlt?@EELeZ+0%J8 z2&6o?s$IVJyyrO)6MmRd_xN|t%U|?m|5KQ9C=6_B*F$3t!9vu%*L`&|?lI|LSxdw2fT59~T6R4W+7@N=e=L(Fs}c zC-a%U?>GYAQt`0*PYbUp)m%LT$<91FNvj(L62?^#f&AT?DT+b;5}|+zX$9TMmb~>Z z*lLl1ke%lyhM{$=%%tIM_l55dsq3OPq^z}eLp&eEUdTpnSsGZD@k^RS08tC|de;bA z6~7np{czI-zUimI*Al?q49KbKypHM>#&OQ5|kOzL51q=RJxv*wWX|qIv$wmifT3i*yEmWhu_ydFZKZ4-Ln|(mf&r*PU zSifbvJvDKYG(~Z$_n0B+DvWUL>LzKrG8_Nkc!4A~b~ zeQUGjf<&I(tb21;zQC;PNIeZTG*SnV*IyNvG{om&2oyWg*3KqdaT5t|(<8XwM`8pDNI+AU+_O&zrHPnq1GIO4Tb>;@1`K z;T`)&<41QppAZq73{D7{T3m~M?STx2kzbRbO@puU7iM;c_K(&!C8ru7By%6xX}vav zHdzZvG7>F3m*y6JJ{gE}j?i%vM(BR`g^IHtWQ|pv5kVI35QT2>fWva9$FFvZ zPEsg_k6JLw0FZWhbdSq3sih_-1q4p$RaNjloeqv8^kpGsOyrz#Zoe%Kyl3MI-MxvC zGu5PmJv` z3d8&GE7hx;koP(=spH)jwi#X6BFQH^wA~5tu+*;6A)Lhay)$~U0)ADwEI`?7F%vJe z4+R>5B~}+C?VNfCX#0FUf8v1dS3eTb6S!S84oi)Iwj8G zx&!o3c5fh78c@0B9P?o66G)fK15#PIfT8}o0%s?(QVhXJx`$8}H^#`%1M zTlt=zsu_pF3@zYj^M>szEpaO+ggK2?*#R15m1e3q9+q>Z5PUU!TY_I>IYM`9Wyj`*LwCtcpzsQWxi4fLy06Hs;uq(Rn(ldXocoqM_*|l?; zJ9v7;ba87#?_970$ldrc@9mERUVmU1{Pn{9kCK6>k?jh05xdfOSU_SHMMCH#3vkdb zm$m@Dc7S?2TY3>5Ac$YHzS`cEodHUZ#_JrAC)0Z=7+&vSv#Fu$*4ls&#%M2r80mHE$SB{v)L)k`-ZnyJk5le`?j zto~%Kv?*IvJ7IruW@uPbE*(qLiVQf#%XpI@L;~haoy`Yy)K@Q$cCQ%xv&JB+(Vc?C zDcm~gK?J1~-qKGgzp|#UpTZEw05u#*o8IvX_;Rfzs=*1U<*+K|{B@Zp3{nt)Ko|O= z_UwW^)DcdNsne&H#B2PhS@uwzwo?vygmq}zkVD~S?e_C1=ZY&TJCZj~t?umHdWVuC zMx1N{+mKNka4Efr^eJZR1)dw|S%d>$7wKgigdDBSD7Cudi@U)`_B7ABa=m+}t0XIc zm~vP}R#Ii;C|KF9U`}gNn77yFVMlX3N9a$WJ5AY618)}_mGoU(jmRs)_h_2*f&J^o zc=7@Yf=nHbW1WGlGq0}peg2<7Urs~^&p*OHOLETD9kH@Em!9|O&^a(G7kze^*#eK- z`fNr$h9cs=mk0&2_I^%kf$nD+u2(Tys%6Q>6{rhpHt?L?LPrCVmo_>mm@uoc*P!Nb zxj6ayAijEareer8IHnb$G;FzVs?4RQOCf)QjF50-WluLFE-v-ih`#rltlaGIHXi1r zOEr#^|> z_Ge^aqi%6Y+P-DGm6iJ1XDE5v-E~}B7i}zKzp*3N0c-5zh5ZECQ*-@j;h}fxGOTCC zEl&?Vy`1M<@S+74PXK+N3oit6P zq{J;&2~T|4Ps2$>l7^GbwR%T9MtkEq=liib90m=%$(5s;Lor+;mcbGuVR*`H~flLI}=uP2O;dFdV|!%7k%&6OJ`$wiwU-BA6m0wN~+au%8s_TY6HoA|Pe zsC#h=w<-dOvrWIN4kk>e^PF()Sni>Pea$YVJK1%&5fz7tLCpPLp695j6S}-sM^vQ_ zZ((NhVu=ukAoeFRcd08Y(ZeemjBIEosk{39y_-A;^w-F5_)y$DNA;m-^Ht5}PHXTw zg6HC4#vv7Ez2vvApf44DzoJz?EzgCVc3D~b(WT9pqLxeLaM*&jE5 zd5^KiURuAZ`n6TXs1l8F!flg~4=BM^q~yX+EI(;`$w_y=KXwJIr{O+Kw`3d);T$y^ zpkWz5fvhB9hVi0o?$M)4A%9G63>e_%FkblL&t#9cV_4_EItIjBkR#`OqLZpGYtdIg zQ{XC{Zp|YQclw@{1OEdTzVydfZKOrxCqIF_(bUd=jW@gfPccY;yRqu|>UpdX#%bwt z=orOlhRLKi%&Sk^9g=xn>3 zXBQ_~PjQTm9d}M{FQTGje>%YEa|K1#?v8-$G@5A68bsz#JC%$0Nc8DT!aVuWIx3F^ zs3z3>De5s`;WA7N{8dAjtnc)cMMxsQKldk3PeavcFwBQK`=41=&V%>}3$othC{*<4PGP%@b=@X>M}DIp3B#evEeVc8=aQiB<>e!)K3d zCGM|M(^Z+m3qdJ{s9&;oXjxIdg&0&-YduYvJ$MwEt{bpLzz8pQw;PX}oXU&U;?jBO zb6m8UY9YgTGT6z%dVD)zg>yvuzQuqPGMK`c8=+Cd3UkAHBQ6$_#n9?$&X{UKmc*#G zm0`OhH4j32atsR>W-;qbAlg_SHdMUoe`g!N*RZiK62Y&QW=h=>?r=b!dUU0(`X%Wo zhn9JlB_qS&iO=lxnG-AR^QvKCPW{W=)hA0JzcqH4r_R??7ko-}=68oGHnHmys0_Od zW7Sjm!&r&o@jlxrnAJ@L2fy-pPic)xCgcxdw-ho=b^b zoT}e1!uMdsnbg|N7jRZphceM0Rn#OejXm(8Ter+&ZmifKRp=?c4^t(Idy5%?Gz3f4y-Y9Ad2v2t-w&-8vaZO2j-=47s)s#;09FbmAp;hAFf0p-XEX zz8))BuM3gGaKo_~+;7`_C2uLpH3r&ED7n5rH21h_Bw^+h}#oLQjjxLuNZP*L>_Q#t0>>ZzVx~Pl{o?3L*J0fNv z892c)= z2bR0DKgC*PD7uyNwMD8Sr!{UDXHeV6*t`6_o-^=GxCjP#_**-8{9{M*|Vw(!qL zjZ@qU@s}3IBh7Com5YK8w-y>BDdMrlC@4TdE|LDjQn*V%N?=K>Cz5G2v=x4G5nZR( z1v6rr-!iJlfEB$*q~%aAEa?K#%b8AGYCh~v3Bw}r^$xL~kqV}ll794ps}Fv4b3Frn@MXgoIjCy?%h z-oV4jqVMXbM^15XKZhmE-4@ydq8Nt(E=bYp4IG4Sg9|J_yz>?j2Yas}8wL;p$g!O& z=IVrs$y7Gn0gQxEFRA&QXt)QLBr;7nfKbuCS`izhHf`kX=`3TCP<)595x}#;ywcu4 zi*EZ3%a8g0p=SvYk~?yLCL{;Yg~o^8w`!gqaNqo~W$EN6lPuOY`|LS9z}RwiPa#ej zo%?R0^w;fUV4?kfRDuLJUtR#tmtc%Cy$Ne7rf2a7{aRs}z{b|?bp$S^5;_MBw(;szr6YVQstR0!%XxD4aOUZS4~hdX zb|8465p_ap7;I8hjAKAEpk1(>WDq5<**o04oC&nl8;U%Wj{l$~@Qc&&f5-sbWIdsF z)IrCn?*sYG@WuN3;fvFEsXo6BUxI!!d|3i{-19vh*Zc07|7f)Qj$r+LU*``Z!nIF( z+hKws_y3UPpy|k4H@k_SlTwNa0RkLX%7BFM^(nmeKg$E)X%xGnUX%+&P^oxVUuR{+ zfNXlso*DzZ>}S1wmVJ-rf)ub{<_M`kKmble_=PDQ(9I}${s&XFzk_t{&n6il`zx<}C-Zd{9yWP+W5!F({(D?YApvB-khYdxs6aN#oJp&vC$H61=$I#8X#0G83+ZT zU5Enw3|8OF=J}K}!2NwZR8dHmRa)V{09`yzH)f3&R=LGV=%UlLDPO%m9?S`B`sm}( zi~nDHUmX_Zw)Q==D1smz0s<;6k`fMrbR(TAF~AVg?Fa}cDIg%NG}7Inv`BY%3|-QU z--B-V5s$j}+53I3?|k32|Cnp$d4^d$wbr`Veg9&%fSc!#DT`WN_TmQv#k4Kt8+F*2 z3+#fVcD$16P}0~h6mL7B>j1@jx*xDdQDrrlVkRVuI(%#4e7?1QX}Brf7_emO@GlQV z4kTr?l$AMh1yT;6}<4~;5%ghA2b5@arizUCfjt+1;yaf(R1Jl)l>3mVaQ9yq+sz(9H_Y5 z;_mW~YPVvUWEA+Iqm~~rl7WYB%=HEW8Ew%66^+dMfEH4-V0BfrA(EZjhn1JfoOgT7 zCyI($*~Hr;A7+=JPd|6SAK+Iq19%NC!bVKyrbk}LgJW<*iHNWpF9m0PY23>l8XUdHN-Lsnp4R5O%4ue&N6 ztw~uSKom|AES{xT{8Bfu$QW9oFF|iJk`_2MBq~lq9z?I6ZxW*DhqsWqS9}m7L-0Y( zp>oz+_RuxjIeX1N`mXU7SqUxjMj1@dR z-(H~uMOfxv2ETOK8(w?+hK-k(k!mkRoHSDHTm-2)ty*Z`nCO%8D<5?^SU!YOxs{iE zBoIMRIappcK0n$l;y=e!M1+N9^l3?WHpo7BV3+O5wST&**iWmAB`&7Dz#hULNB4!0&$aZM?k7$Ue~`aK0h|H*0U4MnHR%%>n4aK4z`XmgvI@brq8^7`Jrm(z zfp`me8UqWz*w93l6ZUC73Aljud?%V^&QHsR!M}M-AphVU+v3lqCY31zVKXXnhnVp3 z1I_bBI*aYlDH&F2wb0;$o1@XOfG3{lt@2b9uq03y4V+><*vv&(1KHWJ)A`JQx7hiL z>-km#v#<4A^H`Is#jTGZvSic$H^teI5ENeGM^aOb!CXM~BUmB`UMC-=7D zmik%!kB5M|+zFYVp!MUn-KK+uTApefq*VNlv0JQNlUy-MH^k;B1C;3v;F*TF;^6g7S^VfSauqSk6vNE^)lBL|_;@+Q7a2Zh54Qi-Et#AMC;iAL|zY8L9qH~auM z_fZ1>w7nF$E(@8=-l|MmH(~R_&ehes7{?{?2JJ<_>5oQ7Quo^Fh?yWgpv#TCDTslw zEA1|KWS=4c2rl^4bsy;_n%H*^4pvS^O0VD<_v2;*8V*z_Db}(*N2*CiyIy_!S#__4 zA1%IfRK++>6as622IKRm`<9bBWiz~Bd1%Zb&}%Lz9*245hfc~e;Q9m6G*^n4s41Q7Q!Px z%%5V8BP)3MG1Ugxi?YrF8dVTLtf&+`=781NTy0KiKEa)Ow;<;pcQN{#1q60kN5#{E z75zqw*&*Mg!|SZnprJ$AvD7(LoBzoMgploIFD~*05ZduNg0e6JEgI^7f_m zW*9Nn&9+_v>)`&k9m9+C)^y#Huh#|>*rp$rg=+cD@7Ya{3%nUinfe66G3rn5R_n}(v5Y7-u)vSuf&n?5|0%7BT6#$z!vB$}geO>2{@3ob=;A*Oe z7M)Syh@=NfZZFsD4*8)$1y~o0BfC7_wVdDP21A)1^d|Sb+jnRVCb>M=UmOvAXp?61 z2}H7Ip;8slBGZ?#YOdebl<jEz1mt{y2*k*7m-BxF10YR`C7uWbtj69 znyJSOI(yd2x2}};7WkVp;yPPkT@>BXu|^_!?xn&40#^tq1z_lehNc~HcsWiwT zd0&;jUMnc*@-xr_Y{}s3DC8b}F$U|1p>c_@cT<}Z$^}b&v_Q4QA#&J0{6=*2btYmb zf;APyI8g7x+4EM4lJ8$;&axPyzce;C$1^05>q&kwREe=53vkzoJm=67>RPMK+8PnQJ}aRc=@i zclW9|)VDk^?WqT;C-+Ab^dD{`khx)rls4R;I3$fk^es;`SP9nN>pb zb9!M+jr^NL0r=JmtWRvo%!H&y`7{GCTeO)>cQoJC^H&)wa{J{~Nft|!69_Q-geBE)m5=o9{Dg8RM7$GfrE@Ggkw6k9xVHCZI8NS@YetMj2V=bUyc( zO?QM#37&fk&6MTkG%?52To40kg{yX3xR@n0LQ*wGz=K&;YAGt<&8BUP0fcfj^K1c5 z9`tE~DFj-Ap2SxK<+;|ta+r=_e&l`AU;>`uXOFvhfezjaE=V!T*b$m}cVAy^_o!5O zxA-zhyE!i&SA*gy%w@q(%MN11VZ{9V9N~IjY?TNlYf_(G5UA%+zrH7$d zYHjPa7W2{pJAKB;!q!*;P7F<$oT6e^fCo@%DXhN*MiS69hq=-xrQLNWH$LS>W(fl| zQUC!4bF3Kp?Fm{$%OOb*8RE98lldpm)q>T`Y7zuRNh3@_+Z7+FLGy?ww`hZ5@r@ZJ z(dFd`CgqeZWH&c@eiqSXvk|`Q1YJfN_d5CcQjDeOU#bn&o6<5CKdL(yZP!L$MGauu z&NQUu^Hnu+v7G=2FMZw-UJdNPw(jTq+Y();@CZwQkU4mt!5YB&5rU5|ZG+a%t|2-% zxFgCD!smr=HLMPjZs3`^?+&T+qjEX}@#snU_nZveSfQ4fUTtUr5BXdMCzbe5hq$!11 zD5sJ5N4hefK-jgkkLWh^n#mZN)9y5VNW}QvH5>9jlr`(l?d>~M@8#IQ6i%ry(zUZ+ z^8?Ecv@yo6CkGm*@3Ekji{c5x904=IdRk9JFY5=tn;5yvqPLr9RfY8unSZN$0vfBo zta~EIW~L1<49PUSwl9D0#!YZL%(_!q%#QXkhLzx(N2J{>OdRtiJw-9H2w`g{r5UCt zAR3Iac+cC5L;@0TEMfHu*}fiIMh8lDx8b%niC!>Uzge;LRd7w>_KSbRF@JX4{zEJ? zb{;Fh{^Zj{E&eQOwGzh*P)gtjcU?|ln2l@GGfqHQPwsFg#Z-2N+hbjEe8D16;SQV7 z0kr=AyocIvt9fJ+)0Gt0t>JnaJ+c@ia3=q4yxN%z@yiWdXk?b#fR)z;F#{-;+hma! zHwB3v$VdJ2pKE^kb52ftq>CDwg=s}bm#<%^s*^XP+G&)`w1_uW3CY-rG>FE_9t~!+ zRiP-MQeM1<9Mcwx7v#TLlQD1*q{tGdA12z$Or@!K=K7h(va)h5ezxiO z@)+z~fywH7!=l06vITDSm7VAD&!&LOCBBmALiz0Wgklq^O{q&xd66$*3x z8}T}94_d<{(km}Gyt}+23_0e}G}@QpGdWjj@f)z^3U%Ti->lvfaiO1lncP=UeGX1o ztRmmcAO+RKSHz-k!b%Sc3fk))uhk*mP$DdA$eqk&*qNFeKD3zpfQjlP}gX5`_ywX@r=~`yiBTum+$u$6D*8ylr1*_Y7iYO=u@YE_h?+-o!CxW*J~Bd3W90 zyD+NT{>{QpxILOsguzonDx0~C#@EIQMk!)G@6ft^Lb+a}zr$=MK8WrEG(qd3I#}y- zAy8xI?-%ZwC1!_n5)z>067BoyXsJm#2>Yt%WYYxA@$v-dPx)>WbF^VBo z6|niP@qLLeA7$I~X&Maofd!})a8DX~j_Bf{++J&nd0WX0MD~$OHSn5y42D1klM=fn zC5LOs)G`;g?Je`Hg>8%5K&_`+4HC0g^1;UG3$ z8Qd*YKPMXO>tfSdD}#MkdNSMmkCW1dhQ{idGa~(%GUtzj7kKDG#ijRe(%xgwAzmOa z3oB#x-f?X! z&LM{DO%7x3cL41JdnIw)UitHTxbTH zSV?RlHN$QVps7?7JQEMCoT@HW)i^n?u0_VEh{?+{HRjY!zO&6#5HhdLrvuGHy^_1P z`wR*;lmZD?7|hICTk{4&?CDC?cBN3CL_fa?VqGu7wiLYNowlbb*SmJUx3?ja+*4?! zppRuG1m*Z?l5%?$yNX_?*@I5m7kT4kR!R1SM=Q55+YhD?hK@_+G_R&gID1?S$Jk25 z(dCA(s!fKpZVruzHn8wlGg}E!APlAOQb?$7Oe^*i)jp?SaD6ak=X^J<+4Wpqu0HtX zg{LiPOc$<;P%F7}%|wEhnfTcgjhzYJKn>VS zD+FT=FNP=2X$z|qKX_$Y*kkC)vsS2v)lUQk`z99^#XQN=(i|9V#l)>%t0+&^;E9MJ zc;?Xi91rQ9z3p67=He{|t|B7K%HGPVSK-`ra*_T>Ozvasv-LFSxHHRC$iw-;pjX(- z@S-rM3*E`p<>FfV52iHxw|vXNQgZJ4eOR0A8wNojq@KSA!MX z`}_+|{Uo->*{RwZEag{{S*LnzN-q}`7g^+U2sasP=adk?Xbl#pc@Tg!-<^8WMSH8# z9n1}SIH7h7Lm|E}kzT7UodxzJt*CJLZ(Y4U;kwbHvb-uZnTzOZ)wO2Uc4GV8` zQw}v2{f$exPHAcIefQZ(wkiv1@)f^J?6GHNRMi2Q?rcD&o9%&$)K|6{@xdyfYIus2 z)>GDFg6NVEEe2nD`v#o4U@J3ZgXP*zLi660$jmp=hhwb zEy-nr*eSVce(yCt=V)vU5C|QF{Fq67NE5yzKR76qGhE}&lW_a74?2j_Q%2;+a>3sd zfB%4kHr7*Lyt>cIZr<*)zt?D1_3>0lM&Ab<V{^oAKmVWtWF*E2TPSzTm!<6 z%@-JCMQJ?klRDNJjoBkhMX@whJu9y|^xf$*`CCvdFGbJZW@gy;ZReMACyFb%p@z~m z847Wu3$$y-zp<*Af(m)=NGU9rWxz2`#Op0bV4UHHq{v}qy%u+?FoU^J%?AFU$Ck`F zJx{YGmQNTjo7{jqdSa^wGMssmFeEIq@X;%Owt6I@$A5OB84oUUF8d)_8_%shPN+(L zKMTaaz*VR3-SrZi$htPQ`7D?E#%_Eh%2P$EEKSX#-uvr$fEys!t}5hi-sXHjM_oE1 z6#GV0+e61i_LaU&4R{rO!0OfV4FbP)Mh{x4Bz%_28VjC@!-*bN{{z+@c=%xjxSsX> zm1Ba?boHfh_J*Nb+0gsMTD&q3AWYW%w;oKxeZt-iD|^d^F^ee_mzC31luj40F>Ey4 zb!@{C5Opo_MC2n!|@SI#%wwW}Hr=lu&uy<=9;|4O@_RWv!goHyG zyf(Qey#AHFgUqw-6tADD2K;_@sXsrv4s^qqDKPP(wQfCz*ET2gTmqEk*zVprRI#S| z6ltENfRDXut~v0&d8G^I#_1n*FgLS3W7{%gZX1~=nah#$woR8h7IG!hE-DN-SQwQc zKX82Mb?w<>m-=Z;_}Ks2{Y@8v3}~9{`qAV zB->U|$%JHSwUZegRAxT8{}9gkEIPMcYu`68nL+cMnFAjQqf{--@nfO5 zlFJ@;b19C^a=RX6(y6}l*YD9^f9N{U|LQY`&wq;dVIp%v6||m&PkRm#zb?lU#}5_y z>;i~0t6)-wp8sY~QJZ&3wJ;a}h+Q8Mwqf!SO{P~=R*}0N^8ViQT8|aAKyV!exGvHz z#xi4p`|`ofmlu=YzXr_Y3o7PqLFUG%=WZ0i&O#{xh+;2id5e^<@4&=U=EU=)mm8}o z9S4G4YWG!+0sh?=2jTDE|6lMOL^=52Q6szmjy3=Eie!*MJdyr_D1*^l{%h z#&>peTBk0SwMIMvx4KNdMk>{ zi)=^oR=uvrPGn(D_{~Rt#CZ~C2YIWoxK16sq!2qLv6|?Y80==r(xJ5ZN`KM`S2d z;-HcEQq+z480hh9i==Yn9ADkS4_j!#G`uwasYqA^211Pw7cI*P6t^07gLH*c3loH2 z2_L_nYYNDwof_1H$vo zr7K}PE~=BD;zprDrN=)VzXd6NnT7r*qx~<9l+T#ZKfr;Ori=_~??tHw2;91s zwH$eErtEC_+@|ZgJIGo7gg+>HBB7}O@*J@;I^*qQ)h9EA{1aM{V zZ2ANm+}+VpMq?n+)n;I23r2SGZ{5#~9A!rlyZZ6M27K^l__=PMau^ zf|l@Q&YmP>S?lW}%uhxf`2<(s(z-;eFRlV+cIz#AmU$D-^Y)S*y&nUY-Ea|YJ**Xg zA9Ul3ONJlx)~wi~5nhjJqeQw_SjG#zd%}01#U;*MRtR%F#~CBE?ClLc*nS(!;KSmJ>co&;^M#8ui5wU(*lt`lVu>^`EXMtg-5LQgBwCg#mbi;Y471`chs~ z?J;kNOB&U|XJMXnltl3#R*HtKC&-oq%yFp01%NqDcShE3Ro*hL!C$lkkRR@iuyUUw zdRjs-4qgtxwk}CG z%&k!V1fp^PFVo!z$N>PfRcLQK{#Z5wR$hCgcohHpQJu`5fb_5s9FW3FXA3zLS|7cj zN{0EB+8|mw{_izeZGvA;!k<-#e~^>|oI1+8GtD_iZyl)nj0}BKWF@8$Fal6W008u7 zuTurl{L@T>XDeH}5#3&U<9i05K#BQ=UuW^3HU|6?EQ^c45CIf7pJc+etpG%&LmYyC z8MaIZ1;oL^icE;=+9E!IkS}F#|4v#tI|uOSgHr%Sn|qpZ$CPM5j^|Xp6!f3O+$P3D zT3jdAO88%`m1qpScxou0+}m0L%pPGgce;TEQ8vQg>E|r_e^(?{kc6w3GE_Rw~UXMgq0L8v|@3k1moGZk7QkVRDtdxT1Ee({v*`lr6{Y;X-Zb zJ*VqbKH-xeL@7~kUzFU!FR!=@s5}mog@-&whn-E*o6IErTyy1q`Z+ZR3?Sk1e7g;l zDKQP~K8rRn4DENiFL!SbjPV)y65ud44H`1ld{`WFUjfF;ic0WZx7a09=pv!_O7sbkv z?>%yuwDTf1uM0+_yUTd#hBE}c>}(65?$%#drt&hEk#5^M|0aKS7`~sYJt?T?Cztt) zey5o#LR1?AQ6>Z6GW<>ZxBvwe8Ws;g3JE~Gbc)71yY$c5OjdCtNB|w>!FV5rwtK&7 z4)_j*3=kCCmKHlXe1vAOyOy*jr!? z17J^@?*gJ!In3>dK=;R#lLH2UbyZA`G&T~p*CM$LsCWng6__4<+>huH>$`|MGGGJ% z=2_?m9K%(4z0xxVU*6G^21rDcUliN|#+TUkR8DhNP;^yRq0BeIlB|1c;`fLOv$Q769D`YDf-rpUc>y+-CCZf$uW@rJ3`$ra9{>0z8)R@CK{R$39YESD z+XN0Cg?6ggke0PhIgb(x32UeikCNCwd4tHa>HaN;3XJ|6~t&zkgr6vELF1r+}*F=WxpSn{euZ*j+zt073uy7w3y~I)EC? zI5j@s+1bzj0IzkiIJyDElIr;)_{!05f7KfB-CvT__y(``qjBZW?j!m2nD&#B-M22E zKluFDh|S+}KmW3F?f1{tkG6k4@MO8?t=U2fH&{ZGnIxNC$(P&Y7-v0cD770NbN;BM zulv4}l+)z&e*;K>wY&mk<0Y!M6;flzIrn3DEc`!#ymSwwxQu?(3%<7X_5FL$Vc&Pc zE3aLo;c@HKi=RM(e`eDE!>)4DUH<0lFNK9Ci>R+JJ%@CJ;5uwT5*REb0eIQ>Bg47r zN4_6<4G?QM8&aE3ze9mLF zx(`CaYG$TirE{E|CzAgZY;Wr%=nBn71ZWIqe76=8+KcE0PYCxS-2TkS^H;|E|MWNi z)$_xz?(NBU|8w^jrL_W}YS9f(dLP$UZ%078px^KKys!Xbb2xps*^Cb+WRulw&c^dx zQE#XOwb<1_N$})VU|N4=2gDBU@anzD!T8tpWAGTZbR5IiJY)S!W-Bv?#N+EB!+?hZ zp9vr`ZBnYq7z>dlW<`mhK!%JS~y% z7=?7HK?ZAIJF|tA%8EEWGQcGX3)az?2y{9d-6Lhn^#}(&gqHxox$;O!vm9z6qMXUuTGT}-bFw$96X;;JTH0c7rkFNFZq;7-_va=r**ob4{` zE%raZ`R5w^^BnxQ^o3NJEMwkc9~<%QO2zjdJLe#p&?nDRH=j12l|{3~SF{WnMNqCw z`D7o+ literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/sd/Rautiainen_Starmap.txt b/src/main/resources/sdtocode/sd/Rautiainen_Starmap.txt new file mode 100644 index 0000000..bbfa7a3 --- /dev/null +++ b/src/main/resources/sdtocode/sd/Rautiainen_Starmap.txt @@ -0,0 +1,95 @@ +0(601,451)starcube: StarCube +@starcube: StarCube +%csvStardata: File +%| | | = +¥starSelection: starset «statics» +%starcube: StarCube +%i I new{starSelection) i L +¥csvStardata: File +%starcube: StarCube +%I B e | JOE et en e bR e s | +¥csvStardata: File +%starcube: StarCube +%| | | = +¥#(351,191)csvStardata: File +@csvStardata: File +%starcube: StarCube +%I B e | JOE et en e bR e s | +¥csvStardata: File +%starcube: StarCube +%| | | = +¥csvStardata: File +%stars: ArravlistAOQjdC&4|q271;D@p01Ws8+)e`$ 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 M{2N-}tB<4q2Mko{oB#j- literal 0 HcmV?d00001 -- Gitee From aa940898dcc33540f10302f97a3dd126dc69dfa4 Mon Sep 17 00:00:00 2001 From: chief Date: Sun, 12 Dec 2021 10:36:13 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uct/umlrecog/UMLDiagramRecognizer.java | 214 +++++++++--------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java index 0f15f07..31b9228 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/UMLDiagramRecognizer.java @@ -20,11 +20,11 @@ public class UMLDiagramRecognizer { * * @param check */ - public static void recogCD(String cd_dir, String repo_name, boolean todo) { - if (todo) { - ClassDiagramRecognizer.recog(cd_dir, repo_name); - } else { + public static void recogCD(String cd_dir, String repo_name, boolean to_check) { + if (to_check) { ClassDiagramRecognizer.recogT(cd_dir, repo_name); + } else { + ClassDiagramRecognizer.recog(cd_dir, repo_name); } } @@ -33,11 +33,11 @@ public class UMLDiagramRecognizer { * * @param todo */ - public static void recogSD(String sd_dir, String repo_name, boolean todo) { - if (todo) { - SequenceDiagramRecognizer.recog(sd_dir, repo_name); - } else { + public static void recogSD(String sd_dir, String repo_name, boolean to_check) { + if (to_check) { // 校验文件 + } else { + SequenceDiagramRecognizer.recog(sd_dir, repo_name); } } @@ -48,106 +48,106 @@ public class UMLDiagramRecognizer { */ public static void main(String[] args) { // 类图实验 - // UMLDiagramRecognizer.recogCD(cd_dir, "Salaboy/smart-tasks", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "abrden/StarCraft", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "Salaboy/smart-tasks", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "abrden/StarCraft", true); // UMLDiagramRecognizer.recogCD(cd_dir, "alexasahis/km2", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "BackupTheBerlios/jpwgen-svn", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "badqiu/rapid-framework", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "bojoer/loadui", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "C204-242-DJSMT/Assignment-1", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "cscfa/bartleby", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "dsarlis/SoftEng", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "egoless/pqs", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "emeric254/Java-STRI-S4", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "bloodmarry12/rapid-framework_googlecode", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "rodrigoazevedomartins/TrabalhoFinalLTPIII", true); - // UMLDiagramRecognizer.recogCD(cd_dir, "ultragdb/org.eclipse.cdt", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "georgejakes/Xug", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "hungnguyen94/BTrouble", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "klemens/openolat", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "lorneliechty/pleaseholdapplause", true); - // UMLDiagramRecognizer.recogCD(cd_dir, "neuroph/neuroph", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "PillowSoPaw/SPSWENG-astroNATS", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "tiendan3108/CP", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "FantomKnight/AndEngine", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "felps/FTFramework", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "fltt/jss7", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "gemxd/gemfirexd-oss", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "ging/isabel", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "hangum/TadpoleForDBTools", true); - // UMLDiagramRecognizer.recogCD(cd_dir, "Istarnion/Team12", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "jaissegrela/steganography", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "jguze/ACiv", false); - UMLDiagramRecognizer.recogCD(cd_dir, "jorgearj/USDLPricing_API", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "kauffmj/modificare", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "kbarrett/third-year-project", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "kuali_rice", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "leemdoyun/android-education-project", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "luis-alberto/magicBinder", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "marcellodesales/my-cs-research", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "OBHITA/Consent2Share", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "petergodfrey/TradeSimulator", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "portmobile/LAGP-Example-Code", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "retoo/bodesuri", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "richardimms/PRCSA", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "rNdm74/Java", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "Sanchez82/Crawler", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "snucsne/bio-inspired-leadership", true); - // UMLDiagramRecognizer.recogCD(cd_dir, "steyskal/Ren-Fest", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "Team-MWSU/GroupProject", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "teopalva/travel-dream", false); - // UMLDiagramRecognizer.recogCD(cd_dir, "valentinamata/flow3in2013", true); - // UMLDiagramRecognizer.recogCD(cd_dir, "WiReSEP/Rollercoaster2011", false); + // UMLDiagramRecognizer.recogCD(cd_dir, "BackupTheBerlios/jpwgen-svn", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "badqiu/rapid-framework", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "bojoer/loadui", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "C204-242-DJSMT/Assignment-1", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "cscfa/bartleby", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "dsarlis/SoftEng", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "egoless/pqs", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "emeric254/Java-STRI-S4", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "bloodmarry12/rapid-framework_googlecode", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "rodrigoazevedomartins/TrabalhoFinalLTPIII", true);// + // UMLDiagramRecognizer.recogCD(cd_dir, "ultragdb/org.eclipse.cdt", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "georgejakes/Xug", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "hungnguyen94/BTrouble", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "klemens/openolat", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "lorneliechty/pleaseholdapplause", true);// + // UMLDiagramRecognizer.recogCD(cd_dir, "neuroph/neuroph", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "PillowSoPaw/SPSWENG-astroNATS", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "tiendan3108/CP", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "FantomKnight/AndEngine", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "felps/FTFramework", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "fltt/jss7", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "gemxd/gemfirexd-oss", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "ging/isabel", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "hangum/TadpoleForDBTools", true);// + // UMLDiagramRecognizer.recogCD(cd_dir, "Istarnion/Team12", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "jaissegrela/steganography", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "jguze/ACiv", true); + UMLDiagramRecognizer.recogCD(cd_dir, "jorgearj/USDLPricing_API", true);// + // UMLDiagramRecognizer.recogCD(cd_dir, "kauffmj/modificare", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "kbarrett/third-year-project", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "kuali_rice", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "leemdoyun/android-education-project", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "luis-alberto/magicBinder", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "marcellodesales/my-cs-research", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "OBHITA/Consent2Share", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "petergodfrey/TradeSimulator", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "portmobile/LAGP-Example-Code", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "retoo/bodesuri", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "richardimms/PRCSA", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "rNdm74/Java", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "Sanchez82/Crawler", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "snucsne/bio-inspired-leadership", true);// + // UMLDiagramRecognizer.recogCD(cd_dir, "steyskal/Ren-Fest", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "Team-MWSU/GroupProject", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "teopalva/travel-dream", true); + // UMLDiagramRecognizer.recogCD(cd_dir, "valentinamata/flow3in2013", true);// + // UMLDiagramRecognizer.recogCD(cd_dir, "WiReSEP/Rollercoaster2011", true); // 顺序图实验 - // UMLDiagramRecognizer.recogSD(sd_dir, "laurikin/java-tetris", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "abhinava/indic-keyboards", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "alessandrocolantoni_mandragora", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "camillelabeille/autofocus", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "cyrus305/ver_3LibraryManagementSystem_MPP", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "dle79/ASD", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "dle79/LibraryMgt", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Edwards9489/estatge-agent-system", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "freedude/Kildare-to-Discover", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Geo-Fence/Geo-Fence", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "inved1/ch.bfh.bti7081.s2013.black", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "kevinstier/VossenEnKonijnen", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "kviniink/Skripsi", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "lordwoo/Degree-Dissertation", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "mcsinking/Group1_MPP_PROJECT", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Pulperi/MLG-360-NOSCOPE-SUDOKU-SOLVER", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "tearvan/SkripsiKIRIDataMining", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "waisuan/undergraduate", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "ws23/IndependentStudy", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Xpitfire/ufo", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "3873757/Software-Engineering", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "adeboni/blackboard-cryptanalysis", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "albanoj2/grp", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "AlinNereid/searchable-encryption", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "BackupTheBerlios/visidia-svn", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "benlau/quickandroid", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Blodir/Stackallax", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "chamhayden/COMP2911-ASS1", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W14T12/GeoChan", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W15T02_TeamTo", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "coinvent/coinvent", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "cs2103jan2015-w13-4j/main", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "gelosie/jdic", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "GiorgosMethe/PredatorVsPrey", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "GitIgitt/SE1415", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "him229/the-gold-hunters", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "jonatasdaniel/tcc", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "ktisha/archive", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "lemmy/SecuredSLP", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "leschman/Coursework", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "pekim/node-jdbc", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "plcortesc/VIN", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Richard-Dang/tetristry-game", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "seeburger-ag/jbossts", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "spectrenoir06/ProjectS2_Ring", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "SpoonLabs/astor", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "timfel/meet4xmas", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Vskilet/eduram", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "Rautiainen/Starmap", false); - // UMLDiagramRecognizer.recogSD(sd_dir, "zy084232/Knowing-Campus", false); + // UMLDiagramRecognizer.recogSD(sd_dir, "laurikin/java-tetris", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "abhinava/indic-keyboards", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "alessandrocolantoni_mandragora", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "camillelabeille/autofocus", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "cyrus305/ver_3LibraryManagementSystem_MPP", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "dle79/ASD", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "dle79/LibraryMgt", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Edwards9489/estatge-agent-system", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "freedude/Kildare-to-Discover", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Geo-Fence/Geo-Fence", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "inved1/ch.bfh.bti7081.s2013.black", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "kevinstier/VossenEnKonijnen", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "kviniink/Skripsi", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "lordwoo/Degree-Dissertation", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "mcsinking/Group1_MPP_PROJECT", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Pulperi/MLG-360-NOSCOPE-SUDOKU-SOLVER", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "tearvan/SkripsiKIRIDataMining", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "waisuan/undergraduate", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "ws23/IndependentStudy", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Xpitfire/ufo", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "3873757/Software-Engineering", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "adeboni/blackboard-cryptanalysis", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "albanoj2/grp", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "AlinNereid/searchable-encryption", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "BackupTheBerlios/visidia-svn", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "benlau/quickandroid", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Blodir/Stackallax", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "chamhayden/COMP2911-ASS1", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W14T12/GeoChan", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "CMPUT301W15T02_TeamTo", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "coinvent/coinvent", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "cs2103jan2015-w13-4j/main", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "gelosie/jdic", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "GiorgosMethe/PredatorVsPrey", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "GitIgitt/SE1415", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "him229/the-gold-hunters", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "jonatasdaniel/tcc", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "ktisha/archive", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "lemmy/SecuredSLP", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "leschman/Coursework", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "pekim/node-jdbc", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "plcortesc/VIN", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Richard-Dang/tetristry-game", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "seeburger-ag/jbossts", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "spectrenoir06/ProjectS2_Ring", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "SpoonLabs/astor", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "timfel/meet4xmas", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Vskilet/eduram", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "Rautiainen/Starmap", true); + // UMLDiagramRecognizer.recogSD(sd_dir, "zy084232/Knowing-Campus", true); } } -- Gitee From f35c6d2fbab1676fc17484095e7a343d29027856 Mon Sep 17 00:00:00 2001 From: chief Date: Wed, 12 Jan 2022 15:46:44 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=94=B6=E9=9B=86?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/data collection.xlsx | Bin 0 -> 36493268 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/data collection.xlsx diff --git a/doc/data collection.xlsx b/doc/data collection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f343581f56092486851909f85c18d98c6b92d6f4 GIT binary patch literal 36493268 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%0Agf-q9sGl8Z!z$fi$Cwhb6`_*j^nBdn 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�t?T_`nA7 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%0A%PVM^i{VX3#p*`Gh_y6d$+s7r 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

?VkxN5%UclnS;q9b@(k|c9?d4FQ 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 dkz!PSTnqybGG@-0CC~w+iY}P} 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�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