{"id":268800,"date":"2015-11-23T17:37:03","date_gmt":"2015-11-23T14:37:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=268800"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=268800","title":{"rendered":"\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Ignite (GridGain) \u0432 200 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430"},"content":{"rendered":"<p>       \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439: XSLT-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0438\u043b\u0438 \u0432\u0438\u0434\u0435\u043e. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u044f \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u0438\u043b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <b>GridGain In-Memory Data Fabric<\/b>. \u041e\u043d \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c distributed computing, MapReduce, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u044d\u0448\u0438 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, job stealing, \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0438 \u0434\u043b\u044f Hadoop \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u043d\u044b\u0435 \u043d\u044b\u043d\u0435 \u0432\u0435\u0449\u0438. \u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0438. \u0412\u044b \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u043f\u043e\u0434 \u0432\u0438\u043d\u0434\u043e\u0432\u0441.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 (2.5 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432). <br \/>  \u0421\u0430\u0439\u0442 \u0431\u044b\u043b \u0432\u044b\u043a\u0430\u0447\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b wget:  <\/p>\n<pre><code class=\"bash\">   C:&gt;start wget110 --recursive  --level 10 -nc --no-clobber    --html-extension   --exclude-directories=it,fr   --convert-links   http:\/\/site.com <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u043d\u0435\u0434\u0435\u043b\u044e \u0433\u0434\u0435-\u0442\u043e. <\/p>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Xidel:  <\/p>\n<pre><code class=\"bash\">REM \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 FOR \/R .\/  %%G IN (dbfamily*.html) DO xidel  &quot;%%G&quot;  --quiet    --extract-file=mytemplate.txt  <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b mytemplate.txt \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0448\u0430\u0431\u043b\u043e\u043d:  <\/p>\n<pre><code class=\"bash\">\/\/td\/h1  || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u0417\u041d\u0410\u0427&quot;)] || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u041f\u041e\u041b&quot;)] || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u041f\u0420\u0418\u0421\u0425\u041e\u0416\u0414\u0415\u041d\u0418\u0415&quot;)] || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u041f\u0415\u0420\u0415\u0412\u041e\u0414&quot;)]  <\/code><\/pre>\n<p>  \u041d\u043e \u0443\u0436 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 java.<\/p>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e XPath-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e html-cleaner<\/p>\n<p>  <b>\u041a\u043e\u0434 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438:<\/b>  <\/p>\n<pre><code class=\"java\">public static ArrayList parseWithXPathList(String path, ArrayList&lt;String&gt; XPathList) { \tcount++; \tString str = &quot;&quot;; \tArrayList list = new ArrayList(); \ttry { \t\tString content = readFile(path, StandardCharsets.UTF_8); \t\tTagNode tagNode = new HtmlCleaner().clean(content); \t\torg.w3c.dom.Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode); \t\t\/\/ And then use the standard JAXP interfaces to query it: \t\tXPath xpath = XPathFactory.newInstance().newXPath(); \t\tIterator&lt;String&gt; it = XPathList.iterator(); \t\twhile (it.hasNext()) { \t\t\tString XPath = it.next(); \t\t\tString res = (String) xpath.evaluate(XPath, doc, XPathConstants.STRING); \t\t\t\tlist.add(res); \t\t\t}  \t\t\t\/\/ System.out.println(str); \t\t} catch (Exception e) { \t\t\tstr = &quot;&quot; + e; \t\t\tlist.add(str); \t\t} \t\treturn list; \t} <\/code><\/pre>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<br \/>  ArrayList Xpaths = new ArrayList(Arrays.asList(&quot;\/\/title&quot;, &quot;\/\/td\/h1&quot;));<br \/>  ArrayList ResultList = parseWithXPathList(param.toString(), Xpaths);<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043a\u0435\u0440\u0430:<br \/>  Files.walkFiletree(startingDir,opts,Integer.MAX_VALUE,parseFiles)<br \/>  \u0418 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u043f\u0430\u0440\u0441\u0435\u0440.  <\/p>\n<pre><code class=\"java\">if (file.toString().endsWith(&quot;.html&quot;)) { \t ArrayList&lt;String&gt; Xpaths= new \t ArrayList&lt;String&gt;(Arrays.asList(&quot;\/\/title&quot;,&quot;\/\/td\/h1&quot;)); \t ArrayList&lt;String&gt; \t ResultList=parseWithXPathList(file.toString(),Xpaths); \t System.out.format(&quot; %d ) %s %n&quot;, count,&quot;&quot;+ResultList); \t  \/\/castOneAsync(ignite, &quot;&quot; + file); \t} <\/code><\/pre>\n<p>  \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~12 \u0447\u0430\u0441\u043e\u0432<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0444\u043e\u0440\u043a\u0430 GridGain, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Apache Ignite.<br \/>  \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0442\u0430\u043a: \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0434\u044b (\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445), \u043d\u043e\u0434\u044b \u043d\u0430\u0439\u0434\u0443\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u0441\u0435\u0442\u0438 \u0438 \u043d\u0430\u043f\u0438\u0448\u0443\u0442 \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044f\u0445 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 (\u044d\u0442\u043e \u0432\u0430\u0448\u0438 slaves). \u042f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b 12 \u043d\u043e\u0434 \u043d\u0430 3 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 (\u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e 4 \u044f\u0434\u0440\u0430 \u0438 16 GB RAM). <br \/>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043a\u0430\u0447\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 (~500GB) \u043f\u0430\u043f\u043e\u0447\u043a\u0430 \u0441 html-\u043a\u0430\u043c\u0438 \u0440\u0430\u0441\u0448\u0430\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e \u0441\u0435\u0442\u043a\u0435. \u0420\u0430\u0441\u0448\u0430\u0440\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043f\u043e\u0447\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u0430 \u0432\u0441\u0435\u043c \u043d\u043e\u0434\u0430\u043c (\u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430!)<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0435 java app \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c master-\u043d\u043e\u0434\u0443:  <\/p>\n<pre><code class=\"java\">Ignite ignite = Ignition.start(&quot;D:\\\\grid\\\\1.4\\\\apache-ignite-fabric-1.4.0-bin\\\\config\\\\default-config.xml&quot;); <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443 \u043d\u0435\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u043a\u0430\u0441\u0442\u043e\u0432\u0430\u0442\u044c job\u2019\u044b \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0434\u044b.<br \/>  \u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 master, slave \u0442\u0443\u0442 \u043e\u0441\u043b\u043e\u0432\u043d\u043e\u0435. \u041d\u043e\u0434\u044b \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b. \u042f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u043d\u043e\u0434\u0443 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043d\u043e\u0434, \u043d\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0438 \u043a \u0447\u0435\u043c\u0443.<\/p>\n<p>  \u041a\u043e\u0434 \u043a\u0430\u0441\u0442\u0443\u044e\u0449\u0438\u0439 job \u0441 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c \u043d\u0430 \u043d\u043e\u0434\u0443:<\/p>\n<pre><code class=\"java\">public static void castOneAsync(Ignite ignite, String param) { \t\/\/ Enable asynchronous mode. \tIgniteCluster cluster = ignite.cluster(); IgniteCompute asyncCompute =                                                       ignite.compute(cluster.forRemotes()).withAsync(); \/\/ Asynchronously execute a job. \tasyncCompute.call(() -&gt; { \t\tSystem.out.println(&quot;processing: &quot; + param);  ArrayList&lt;String&gt; Xpaths = new  ArrayList&lt;String&gt;(Arrays.asList(&quot;\/\/title&quot;, &quot;\/\/td\/h1&quot;)); ArrayList&lt;String&gt; ResultList = parseWithXPathList(param.toString(), Xpaths);  \tSystem.out.format(&quot; %d ) %s \\n %n&quot;, count, &quot;&quot; + ResultList); \treturn &quot;&quot;+param+&quot; :&quot; + ResultList; \t});  \t\/\/ Get the future for the above invocation. \tIgniteFuture&lt;String&gt; fut = asyncCompute.future();  \t\/\/ Asynchronously listen for completion and print out the result. \tfut.listen(f -&gt; { \t\tString resultStr = f.get()+&quot; \\n&quot;; \t\t\/\/ System.out.println(&quot;Job result: &quot; + resultStr); \t\tcount++; \t\t\ttry {            Files.write(Paths.get(&quot;d:\\\\grid\\\\result.txt&quot;), resultStr.getBytes(), StandardOpenOption.APPEND); \t\t\t} catch (IOException e) { \t\t\t\tSystem.out.println(&quot;&quot; + e); \t\t\t} \t\t\tif (count%100==0) System.out.println( &quot;processed: &quot;+count   ); \t\t}); \t}  <\/code><\/pre>\n<p>  \u0412\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:   <\/p>\n<ul>\n<li> \u041d\u043e\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0430\u043f\u043a\u0443 \u0441 java \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0432 \u0432\u0438\u0434\u0435 default-config.xml \u0444\u0430\u0439\u043b\u0430. \u0421\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u0437 ignite.bat.<br \/>  \u041f\u0430\u043f\u043a\u0443 \u0441 \u043d\u043e\u0434\u043e\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u043e\u0434\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<br \/>  <a href=\"http:\/\/www.eu.apache.org\/dist\/\/ignite\/1.4.0\/apache-ignite-fabric-1.4.0-bin.zip\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0434\u0443<\/a> (\u041e\u043d\u0438 \u0435\u0435 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 fabric&#8217;\u043e\u0439)  <\/li>\n<li> \u0423 \u0432\u0441\u0435\u0445 \u043d\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/li>\n<li> Ignite \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e peer class loading (Zero Deployment). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0432\u0441\u0435 \u043d\u043e\u0434\u044b. \u041e\u043d \u0441\u0430\u043c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u0430\u044f \u0444\u0438\u0447\u0430. \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<br \/>  \u041d\u043e \u043d\u0430\u0434\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0447\u0443 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u0438\u0448\u0443\u0442, \u0447\u0442\u043e \u0441 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0438\u0447\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.    <\/li>\n<li> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0434 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438 \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c. <\/li>\n<li> \u0414\u0430, \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u043e\u0434\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043f\u043f.   <\/li>\n<li> \u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043c\u0430\u0448\u0438\u043d \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 <\/li>\n<li> \u041d\u0443\u0436\u043d\u0430 java 8, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f lambda <\/li>\n<li> \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c master node, \u0442\u043e \u0442\u0430\u0441\u043a\u0438, \u043a-\u0435 \u043e\u043d\u0430 \u043a\u0430\u0441\u0442\u0430\u043d\u0443\u043b\u0430, \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0443\u043c\u0440\u0443\u0442. <\/li>\n<li> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e job&#8217;\u043e\u0432, \u043d\u043e \u044f \u0434\u043e\u0432\u0435\u0440\u0438\u043b\u0441\u044f \u0432\u0438\u0437\u0430\u0440\u0434\u0443 \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u043c\u0443 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043b\u0443\u0447\u0448\u0435 \u043a\u0438\u043d\u0443\u0442\u044c job<\/li>\n<\/ul>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043e\u0434\u0438\u043d java class ~200 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438. \u041a\u043b\u0430\u0441\u0441\u0443 \u043d\u0443\u0436\u043d\u044b jar files \u0441 htmlcleaner \u0438 apache ignite.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e html cleaner \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 Xidel. \u041e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 XQuery \u0438 XPath.<br \/>  T\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441 \u043d\u043e\u0434\u0430\u043c\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e PATH \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u044c\u0442 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 java. \u0417\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442\u0435 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0442\u044c\u0441\u044f XQuery.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u0435\u0449\u0435 \u043f\u0440\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u044d\u0448, \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 distributed \u0448\u0442\u0443\u0447\u043a\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435<\/p>\n<p>  <a href=\"http:\/\/dirs.info\/ParseHTMLCluster.zip\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f Eclipse <\/a><\/p>\n<p>   \u2014 <a name=\"habracut\"><\/a><\/p>\n<pre><code class=\"java\">package gridE;  import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCluster; import org.apache.ignite.IgniteCompute; import org.apache.ignite.Ignition; import org.apache.ignite.lang.IgniteFuture; import org.htmlcleaner.CleanerProperties; import org.htmlcleaner.DomSerializer; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode;  import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory;  import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.EnumSet; import java.util.Iterator; import java.util.Scanner; import static java.nio.file.FileVisitResult.CONTINUE;  \/**  * Created by Veaceslav Kunitki on 11\/13\/2015.  * This class parse files on cluster with &quot;Apache Ignite&quot; framework  *\/  import static java.nio.file.FileVisitResult.*;  public class ParseFilesOnCluster extends SimpleFileVisitor&lt;Path&gt; {  \tIgnite ignite;  \tpublic static long count = 0; \/\/  counter of parsed files  \t\/\/ Java standart FileTree walker  \t@Override \tpublic FileVisitResult visitFile(Path file, BasicFileAttributes attr) { \t\tif (attr.isSymbolicLink()) { \t\t\tSystem.out.format(&quot;Symbolic link: %s &quot;, file); \t\t} else if (attr.isRegularFile()) { \t\t\t\/\/ System.out.format(&quot;Regular file: %s &quot;, file);  \t\t\tif (file.toString().endsWith(&quot;.html&quot;) ) { \t\t\t\/\/if (file.toString().endsWith(&quot;.html&quot;) ) { \/\/ uncomment it for serial  processing \t\t\t\t\/\/ArrayList&lt;String&gt; Xpaths = new ArrayList&lt;String&gt;(Arrays.asList(&quot;\/\/title&quot;, &quot;\/\/td\/h1&quot;)); \t\t\t\t\/\/ ArrayList&lt;String&gt; \t\t\t\t\/\/ ResultList=parseWithXPathList(file.toString(),Xpaths); \t\t\t\t\/\/ System.out.format(&quot; %d ) %s %n&quot;, count,&quot;&quot;+ResultList); \t\t\t\tcastOneAsync(ignite, &quot;&quot; + file); \/\/ parallel processing \t\t\t} \t\t} else { \t\t\tSystem.out.format(&quot;Other: %s &quot;, file); \t\t} \t\treturn CONTINUE; \t}  \t\/\/ Print each directory visited. \t@Override \tpublic FileVisitResult postVisitDirectory(Path dir, IOException exc) { \t\tSystem.out.format(&quot;Directory: %s%n&quot;, dir); \t\treturn CONTINUE; \t}  \t@Override \tpublic FileVisitResult visitFileFailed(Path file, IOException exc) { \t\tSystem.err.println(exc); \t\treturn CONTINUE; \t}  \tstatic String readFile(String path, Charset encoding) throws IOException { \t\tbyte[] encoded = Files.readAllBytes(Paths.get(path)); \t\treturn new String(encoded, encoding); \t}  \tpublic static ArrayList parseWithXPathList(String path, ArrayList&lt;String&gt; XPathList) { \t\tcount++; \t\tString str = &quot;&quot;; \t\tArrayList list = new ArrayList(); \t\ttry { \t\t\tString content = readFile(path, StandardCharsets.UTF_8); \t\t\tTagNode tagNode = new HtmlCleaner().clean(content); \t\t\torg.w3c.dom.Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode); \t\t\t\/\/ And then use the standard JAXP interfaces to query it: \t\t\tXPath xpath = XPathFactory.newInstance().newXPath(); \t\t\t\/\/ String str = (String) xpath.evaluate(&quot;\/\/div\/\/td[contains(@id, \t\t\t\/\/ 'foo')]\/text()&quot;, \t\t\tIterator&lt;String&gt; it = XPathList.iterator(); \t\t\twhile (it.hasNext()) { \t\t\t\tString XPath = it.next(); \t\t\t\tString res = (String) xpath.evaluate(XPath, doc, XPathConstants.STRING); \t\t\t\tlist.add(res); \t\t\t}  \t\t\t\/\/ System.out.println(str); \t\t} catch (Exception e) { \t\t\tstr = &quot;&quot; + e; \t\t\tlist.add(str); \t\t} \t\treturn list; \t}  \t\/* \t * Asynchronously execute a job on external PC \t *\/ \tpublic static void castOneAsync(Ignite ignite, String param) { \t\t\/\/ Enable asynchronous mode. \t\tIgniteCluster cluster = ignite.cluster(); \t\t\/\/ IgniteCompute compute1 = ignite.compute(cluster.forRemotes());  \t\tIgniteCompute asyncCompute = ignite.compute(cluster.forRemotes()).withAsync();  \t\t\/\/ Asynchronously execute a job. \t\tasyncCompute.call(() -&gt; { \t\t\t\/\/ Print hello world on some cluster node and wait for completion. \t\t\tSystem.out.println(&quot;processing: &quot; + param); \t\t\tArrayList&lt;String&gt; Xpaths = new ArrayList&lt;String&gt;(Arrays.asList(&quot;\/\/title&quot;, &quot;\/\/li\/@data-zoom&quot;)); \t\t\tArrayList&lt;String&gt; ResultList = parseWithXPathList(param.toString(), Xpaths); \t\t\tSystem.out.format(&quot; %d ) %s \\n %n&quot;, count, &quot;&quot; + ResultList); \t\t\tString text = new Scanner(new File(param.toString()), &quot;UTF-8&quot;).useDelimiter(&quot;\\\\A&quot;).next(); \t\t\treturn &quot;{ 'url':&quot; + param + &quot; ,'ResultList'=&quot; + ResultList + &quot; }&quot;; \t\t});  \t\t\/\/ Get the future for the above invocation. \t\tIgniteFuture&lt;String&gt; fut = asyncCompute.future();  \t\t\/\/ Asynchronously listen for completion and print out the result. \t\tfut.listen(f -&gt; { \t\t\tString resultStr = f.get() + &quot; \\n&quot;; \t\t\t\/\/ System.out.println(&quot;Job result: &quot; + resultStr); \t\t\tcount++;  \t\t\ttry { \t\t\t\tFiles.write(Paths.get(&quot;d:\\\\grid\\\\result.txt&quot;), resultStr.getBytes(), StandardOpenOption.APPEND ); \/\/Warning! File must be exist, do it manual! \t\t\t} catch (IOException e) { \t\t\t\tSystem.out.println(&quot;&quot; + e); \t\t\t} \t\t\tif (count % 100 == 0) \t\t\t\tSystem.out.println(&quot;processed: &quot; + count); \t\t}); \t}  \tpublic static void main(String[] args) throws Exception { \t\tSystem.out.println(&quot;# Distributed parser!&quot;); \t\tIgnite ignite = Ignition.start(&quot;D:\\\\grid\\\\1.4\\\\apache-ignite-fabric-1.4.0-bin\\\\config\\\\default-config.xml&quot;);\t \t\tIgniteCluster cluster = ignite.cluster(); \t\t\/\/ Compute instance over remote nodes. \t\tIgniteCompute compute4remote = ignite.compute(cluster.forRemotes()); \t\t\/\/ Print hello message on all remote nodes. \t\tcompute4remote.broadcast( \t\t\t\t() -&gt; System.out.println(&quot;---===Distributed parser started===---: &quot; + cluster.localNode().id())); \t\tSystem.out.println( &quot;Cluster ready!&quot;   ); \t\tif (true) { \/\/ start parsing job \t\t\t\/\/ final Path startingDir = Paths.get(&quot;d:\/home\/familytree.ru\/&quot;); \t\t\tPath startingDir = Paths.get(&quot;\\\\\\\\SERGIU-PC\\\\temp&quot;); \/\/ shared directory with HTML-files \t\t\tEnumSet&lt;FileVisitOption&gt; opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); \t\t\tParseFiles parseFiles = new ParseFiles(); \t\t\tparseFiles.ignite = ignite; \t\t\t\/\/ log time to file \t\t\tPrintWriter writer = new PrintWriter(&quot;d:\\\\grid\\\\start.txt&quot;, &quot;UTF-8&quot;);\t\t\t \t\t\tString dateTime = &quot;&quot; + (new Date()); \t\t\twriter.println(dateTime + &quot;\\n&quot;); \t\t\tSystem.out.println(dateTime + &quot;\\n&quot;); \t\t\twriter.close(); \t\t\tSystem.out.println(&quot;# walking...!&quot;); \t\t\tFiles.walkFileTree(startingDir, opts, Integer.MAX_VALUE, parseFiles); \t\t\t\/\/ log end time\t\t\t \t\t\tdateTime = &quot;&quot; + (new Date()); \t\t\tFiles.write(Paths.get(&quot;d:\\\\grid\\\\start.txt&quot;), dateTime.getBytes(), StandardOpenOption.APPEND); \t\t} \t} }  <\/code><\/pre>\n<p>  <b>POM- file \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/b><\/p>\n<pre><code class=\"java\">&lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot; \txsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt; \t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt; \t&lt;groupId&gt;gridE&lt;\/groupId&gt; \t&lt;artifactId&gt;gridE&lt;\/artifactId&gt; \t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;   \t&lt;repositories&gt; \t\t&lt;repository&gt; \t\t\t&lt;id&gt;GridGain External Repository&lt;\/id&gt; \t\t\t&lt;url&gt;http:\/\/www.gridgainsystems.com\/nexus\/content\/repositories\/external&lt;\/url&gt; \t\t&lt;\/repository&gt; \t&lt;\/repositories&gt;   \t&lt;dependencies&gt;  \t\t&lt;dependency&gt; \t\t\t&lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt; \t\t\t&lt;artifactId&gt;ignite-core&lt;\/artifactId&gt; \t\t\t&lt;version&gt;1.4.0&lt;\/version&gt; \t\t&lt;\/dependency&gt;  \t\t&lt;dependency&gt; \t\t\t&lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt; \t\t\t&lt;artifactId&gt;ignite-spring&lt;\/artifactId&gt; \t\t\t&lt;version&gt;1.1.4&lt;\/version&gt; \t\t&lt;\/dependency&gt;  \t\t&lt;dependency&gt; \t\t\t&lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt; \t\t\t&lt;artifactId&gt;ignite-indexing&lt;\/artifactId&gt; \t\t\t&lt;version&gt;1.4.0&lt;\/version&gt; \t\t&lt;\/dependency&gt;  \t\t&lt;dependency&gt; \t\t\t&lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt; \t\t\t&lt;artifactId&gt;ignite-examples&lt;\/artifactId&gt; \t\t\t&lt;version&gt;1.0.0-RC1&lt;\/version&gt; \t\t&lt;\/dependency&gt; \t\t&lt;dependency&gt; \t\t\t&lt;groupId&gt;net.sourceforge.htmlcleaner&lt;\/groupId&gt; \t\t\t&lt;artifactId&gt;htmlcleaner&lt;\/artifactId&gt; \t\t\t&lt;version&gt;2.15&lt;\/version&gt; \t\t&lt;\/dependency&gt; \t&lt;\/dependencies&gt;      &lt;\/project&gt; <\/code><\/pre>\n<p>  <b>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u043d\u043e\u0434\u044b <\/b><\/p>\n<pre><code class=\"java\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;  &lt;!--     _________        _____ __________________        _____     __  ____\/___________(_)______  \/__  ____\/______ ____(_)_______     _  \/ __  __  ___\/__  \/ _  __  \/ _  \/ __  _  __ `\/__  \/ __  __ \\     \/ \/_\/ \/  _  \/    _  \/  \/ \/_\/ \/  \/ \/_\/ \/  \/ \/_\/ \/ _  \/  _  \/ \/ \/     \\____\/   \/_\/     \/_\/   \\_,__\/   \\____\/   \\__,_\/  \/_\/   \/_\/ \/_\/  Copyright (C) GridGain Systems. All Rights Reserved.  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);  you may not use this file except in compliance with the License.  You may obtain a copy of the License at      http:\/\/www.apache.org\/licenses\/LICENSE-2.0  Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License. --&gt;  &lt;!--     Ignite Spring configuration file. --&gt; &lt;beans xmlns=&quot;http:\/\/www.springframework.org\/schema\/beans&quot;        xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;        xmlns:util=&quot;http:\/\/www.springframework.org\/schema\/util&quot;        xsi:schemaLocation=&quot;         http:\/\/www.springframework.org\/schema\/beans         http:\/\/www.springframework.org\/schema\/beans\/spring-beans-2.5.xsd         http:\/\/www.springframework.org\/schema\/util         http:\/\/www.springframework.org\/schema\/util\/spring-util-2.0.xsd&quot;&gt;     &lt;bean class=&quot;org.apache.ignite.configuration.IgniteConfiguration&quot;&gt;         &lt;!-- Set to true to enable grid-aware class loading for examples, default is false. --&gt;         &lt;property name=&quot;peerClassLoadingEnabled&quot; value=&quot;true&quot;\/&gt;          &lt;property name=&quot;marshaller&quot;&gt;             &lt;bean class=&quot;org.apache.ignite.marshaller.optimized.OptimizedMarshaller&quot;&gt;                 &lt;!-- Set to false to allow non-serializable objects in examples, default is true. --&gt;                 &lt;property name=&quot;requireSerializable&quot; value=&quot;false&quot;\/&gt;             &lt;\/bean&gt;         &lt;\/property&gt;          &lt;!-- Enable events for examples. --&gt;         &lt;property name=&quot;includeEventTypes&quot;&gt;             &lt;util:constant static-field=&quot;org.apache.ignite.events.EventType.EVTS_ALL&quot;\/&gt;         &lt;\/property&gt;           &lt;!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --&gt;         &lt;property name=&quot;discoverySpi&quot;&gt;             &lt;bean class=&quot;org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi&quot;&gt;                 &lt;property name=&quot;ipFinder&quot;&gt;                     &lt;!-- Uncomment multicast IP finder to enable multicast-based discovery of initial nodes. --&gt;                     &lt;!--&lt;bean class=&quot;org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder&quot;&gt;--&gt;                     &lt;bean class=&quot;org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder&quot;&gt;                         &lt;property name=&quot;addresses&quot;&gt;                             &lt;list&gt;                                 &lt;!-- In distributed environment, replace with actual host IP address. --&gt;                                 &lt;value&gt;127.0.0.1:47500..47509&lt;\/value&gt; \t\t\t\t&lt;value&gt;192.168.4.110:47500..47509&lt;\/value&gt; \t\t\t\t&lt;value&gt;192.168.4.117:47500..47509&lt;\/value&gt;                             &lt;\/list&gt;                         &lt;\/property&gt;                     &lt;\/bean&gt;                 &lt;\/property&gt;             &lt;\/bean&gt;         &lt;\/property&gt;       &lt;property name=&quot;cacheConfiguration&quot;&gt;         &lt;bean class=&quot;org.apache.ignite.configuration.CacheConfiguration&quot;&gt;             &lt;!-- Set a cache name. --&gt;             &lt;property name=&quot;name&quot; value=&quot;cacheName&quot;\/&gt;                          &lt;!-- Set cache mode. --&gt;             &lt;property name=&quot;cacheMode&quot; value=&quot;PARTITIONED&quot;\/&gt;           &lt;\/bean&gt;     &lt;\/property&gt;        &lt;\/bean&gt; &lt;\/beans&gt;  <\/code><\/pre>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/271475\/\"> http:\/\/habrahabr.ru\/post\/271475\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439: XSLT-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0438\u043b\u0438 \u0432\u0438\u0434\u0435\u043e. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u044f \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u0438\u043b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <b>GridGain In-Memory Data Fabric<\/b>. \u041e\u043d \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c distributed computing, MapReduce, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u044d\u0448\u0438 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, job stealing, \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0438 \u0434\u043b\u044f Hadoop \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u043d\u044b\u0435 \u043d\u044b\u043d\u0435 \u0432\u0435\u0449\u0438. \u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0438. \u0412\u044b \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u043f\u043e\u0434 \u0432\u0438\u043d\u0434\u043e\u0432\u0441.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 (2.5 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432). <br \/>  \u0421\u0430\u0439\u0442 \u0431\u044b\u043b \u0432\u044b\u043a\u0430\u0447\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b wget:  <\/p>\n<pre><code class=\"bash\">   C:&gt;start wget110 --recursive  --level 10 -nc --no-clobber    --html-extension   --exclude-directories=it,fr   --convert-links   http:\/\/site.com <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u043d\u0435\u0434\u0435\u043b\u044e \u0433\u0434\u0435-\u0442\u043e. <\/p>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Xidel:  <\/p>\n<pre><code class=\"bash\">REM \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 FOR \/R .\/  %%G IN (dbfamily*.html) DO xidel  &quot;%%G&quot;  --quiet    --extract-file=mytemplate.txt  <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b mytemplate.txt \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0448\u0430\u0431\u043b\u043e\u043d:  <\/p>\n<pre><code class=\"bash\">\/\/td\/h1  || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u0417\u041d\u0410\u0427&quot;)] || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u041f\u041e\u041b&quot;)] || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u041f\u0420\u0418\u0421\u0425\u041e\u0416\u0414\u0415\u041d\u0418\u0415&quot;)] || &quot; # &quot; ||  \/\/td[contains(text(),&quot;\u041f\u0415\u0420\u0415\u0412\u041e\u0414&quot;)]  <\/code><\/pre>\n<p>  \u041d\u043e \u0443\u0436 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 java.<\/p>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e XPath-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e html-cleaner<\/p>\n<p>  <b>\u041a\u043e\u0434 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438:<\/b>  <\/p>\n<pre><code class=\"java\">public static ArrayList parseWithXPathList(String path, ArrayList&lt;String&gt; XPathList) { \tcount++; \tString str = &quot;&quot;; \tArrayList list = new ArrayList(); \ttry { \t\tString content = readFile(path, StandardCharsets.UTF_8); \t\tTagNode tagNode = new HtmlCleaner().clean(content); \t\torg.w3c.dom.Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode); \t\t\/\/ And then use the standard JAXP interfaces to query it: \t\tXPath xpath = XPathFactory.newInstance().newXPath(); \t\tIterator&lt;String&gt; it = XPathList.iterator(); \t\twhile (it.hasNext()) { \t\t\tString XPath = it.next(); \t\t\tString res = (String) xpath.evaluate(XPath, doc, XPathConstants.STRING); \t\t\t\tlist.add(res); \t\t\t}  \t\t\t\/\/ System.out.println(str); \t\t} catch (Exception e) { \t\t\tstr = &quot;&quot; + e; \t\t\tlist.add(str); \t\t} \t\treturn list; \t} <\/code><\/pre>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<br \/>  ArrayList Xpaths = new ArrayList(Arrays.asList(&quot;\/\/title&quot;, &quot;\/\/td\/h1&quot;));<br \/>  ArrayList ResultList = parseWithXPathList(param.toString(), Xpaths);<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043a\u0435\u0440\u0430:<br \/>  Files.walkFiletree(startingDir,opts,Integer.MAX_VALUE,parseFiles)<br \/>  \u0418 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u043f\u0430\u0440\u0441\u0435\u0440.  <\/p>\n<pre><code class=\"java\">if (file.toString().endsWith(&quot;.html&quot;)) { \t ArrayList&lt;String&gt; Xpaths= new \t ArrayList&lt;String&gt;(Arrays.asList(&quot;\/\/title&quot;,&quot;\/\/td\/h1&quot;)); \t ArrayList&lt;String&gt; \t ResultList=parseWithXPathList(file.toString(),Xpaths); \t System.out.format(&quot; %d ) %s %n&quot;, count,&quot;&quot;+ResultList); \t  \/\/castOneAsync(ignite, &quot;&quot; + file); \t} <\/code><\/pre>\n<p>  \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~12 \u0447\u0430\u0441\u043e\u0432<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0444\u043e\u0440\u043a\u0430 GridGain, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Apache Ignite.<br \/>  \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0442\u0430\u043a: \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0434\u044b (\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445), \u043d\u043e\u0434\u044b \u043d\u0430\u0439\u0434\u0443\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u0441\u0435\u0442\u0438 \u0438 \u043d\u0430\u043f\u0438\u0448\u0443\u0442 \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044f\u0445 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 (\u044d\u0442\u043e \u0432\u0430\u0448\u0438 slaves). \u042f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b 12 \u043d\u043e\u0434 \u043d\u0430 3 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 (\u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e 4 \u044f\u0434\u0440\u0430 \u0438 16 GB RAM). <br \/>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043a\u0430\u0447\u043a\u0438 \u0441\u0430\u0439\u0442\u0430 (~500GB) \u043f\u0430\u043f\u043e\u0447\u043a\u0430 \u0441 html-\u043a\u0430\u043c\u0438 \u0440\u0430\u0441\u0448\u0430\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e \u0441\u0435\u0442\u043a\u0435. \u0420\u0430\u0441\u0448\u0430\u0440\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043f\u043e\u0447\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u0430 \u0432\u0441\u0435\u043c \u043d\u043e\u0434\u0430\u043c (\u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430!)<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0435 java app \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c master-\u043d\u043e\u0434\u0443:  <\/p>\n<pre><code class=\"java\">Ignite ignite = Ignition.start(&quot;D:\\\\grid\\\\1.4\\\\apache-ignite-fabric-1.4.0-bin\\\\config\\\\default-config.xml&quot;); <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443 \u043d\u0435\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u043a\u0430\u0441\u0442\u043e\u0432\u0430\u0442\u044c job\u2019\u044b \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0434\u044b.<br \/>  \u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 master, slave \u0442\u0443\u0442 \u043e\u0441\u043b\u043e\u0432\u043d\u043e\u0435. \u041d\u043e\u0434\u044b \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b. \u042f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u043d\u043e\u0434\u0443 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043d\u043e\u0434, \u043d\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0438 \u043a \u0447\u0435\u043c\u0443.<\/p>\n<p>  \u041a\u043e\u0434 \u043a\u0430\u0441\u0442\u0443\u044e\u0449\u0438\u0439 job \u0441 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c \u043d\u0430 \u043d\u043e\u0434\u0443:<\/p>\n<pre><code class=\"java\">public static void castOneAsync(Ignite ignite, String param) { \t\/\/ Enable asynchronous mode. \tIgniteCluster cluster = ignite.cluster(); IgniteCompute asyncCompute =                                                       ignite.compute(cluster.forRemotes()).withAsync(); \/\/ Asynchronously execute a job. \tasyncCompute.call(() -&gt; { \t\tSystem.out.println(&quot;processing: &quot; + param);  ArrayList&lt;String&gt; Xpaths = new  ArrayList&lt;String&gt;(Arrays.asList(&quot;\/\/title&quot;, &quot;\/\/td\/h1&quot;)); ArrayList&lt;String&gt; ResultList = parseWithXPathList(param.toString(), Xpaths);  \tSystem.out.format(&quot; %d ) %s \\n %n&quot;, count, &quot;&quot; + ResultList); \treturn &quot;&quot;+param+&quot; :&quot; + ResultList; \t});  \t\/\/ Get the future for the above invocation. \tIgniteFuture&lt;String&gt; fut = asyncCompute.future();  \t\/\/ Asynchronously listen for completion and print out the result. \tfut.listen(f -&gt; { \t\tString resultStr = f.get()+&quot; \\n&quot;; \t\t\/\/ System.out.println(&quot;Job result: &quot; + resultStr); \t\tcount++; \t\t\ttry {            Files.write(Paths.get(&quot;d:\\\\grid\\\\result.txt&quot;), resultStr.getBytes(), StandardOpenOption.APPEND); \t\t\t} catch (IOException e) { \t\t\t\tSystem.out.println(&quot;&quot; + e); \t\t\t} \t\t\tif (count%100==0) System.out.println( &quot;processed: &quot;+count   ); \t\t}); \t}  <\/code><\/pre>\n<p>  \u0412\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:   <\/p>\n<ul>\n<li> \u041d\u043e\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0430\u043f\u043a\u0443 \u0441 java \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0432 \u0432\u0438\u0434\u0435 default-config.xml \u0444\u0430\u0439\u043b\u0430. \u0421\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u0437 ignite.bat.<br \/>  \u041f\u0430\u043f\u043a\u0443 \u0441 \u043d\u043e\u0434\u043e\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u043e\u0434\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<br \/>  <a href=\"http:\/\/www.eu.apache.org\/dist\/\/ignite\/1.4.0\/apache-ignite-fabric-1.4.0-bin.zip\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0434\u0443<\/a> (\u041e\u043d\u0438 \u0435\u0435 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 fabric&#8217;\u043e\u0439)  <\/li>\n<li> \u0423 \u0432\u0441\u0435\u0445 \u043d\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/li>\n<li> Ignite \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e peer class loading (Zero Deployment). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0432\u0441\u0435 \u043d\u043e\u0434\u044b. \u041e\u043d \u0441\u0430\u043c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u0430\u044f \u0444\u0438\u0447\u0430. \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<br \/>  \u041d\u043e \u043d\u0430\u0434\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0447\u0443 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u0438\u0448\u0443\u0442, \u0447\u0442\u043e \u0441 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0438\u0447\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.    <\/li>\n<li> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0434 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438 \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c. <\/li>\n<li> \u0414\u0430, \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u043e\u0434\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043f\u043f.   <\/li>\n<li> \u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043c\u0430\u0448\u0438\u043d \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 <\/li>\n<li> \u041d\u0443\u0436\u043d\u0430 java 8, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f lambda <\/li>\n<li> \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c master node, \u0442\u043e \u0442\u0430\u0441\u043a\u0438, \u043a-\u0435 \u043e\u043d\u0430 \u043a\u0430\u0441\u0442\u0430\u043d\u0443\u043b\u0430, \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0443\u043c\u0440\u0443\u0442. <\/li>\n<li> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e job&#8217;\u043e\u0432, \u043d\u043e \u044f \u0434\u043e\u0432\u0435\u0440\u0438\u043b\u0441\u044f \u0432\u0438\u0437\u0430\u0440\u0434\u0443 \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u043c\u0443 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043b\u0443\u0447\u0448\u0435 \u043a\u0438\u043d\u0443\u0442\u044c job<\/li>\n<\/ul>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043e\u0434\u0438\u043d java class ~200 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438. \u041a\u043b\u0430\u0441\u0441\u0443 \u043d\u0443\u0436\u043d\u044b jar files \u0441 htmlcleaner \u0438 apache ignite.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e html cleaner \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 Xidel. \u041e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 XQuery \u0438 XPath.<br \/>  T\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441 \u043d\u043e\u0434\u0430\u043c\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e PATH \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u044c\u0442 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 java. \u0417\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442\u0435 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0442\u044c\u0441\u044f XQuery.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u0435\u0449\u0435 \u043f\u0440\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u044d\u0448, \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 distributed \u0448\u0442\u0443\u0447\u043a\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435<\/p>\n<p>  <a href=\"http:\/\/dirs.info\/ParseHTMLCluster.zip\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f Eclipse <\/a><\/p>\n<p>   \u2014 <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-268800","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/268800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=268800"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/268800\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=268800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=268800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=268800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}