<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Lei&#39;s Blog</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://huashishaojie.github.io/"/>
  <updated>2019-06-12T01:35:47.828Z</updated>
  <id>https://huashishaojie.github.io/</id>
  
  <author>
    <name>zhangleijie</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>YARN工作原理及其工作流程</title>
    <link href="https://huashishaojie.github.io/2018/06/08/YARN%E5%8E%9F%E7%90%86%E5%8F%8A%E5%85%B6%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B/"/>
    <id>https://huashishaojie.github.io/2018/06/08/YARN原理及其工作流程/</id>
    <published>2018-06-08T06:24:58.000Z</published>
    <updated>2019-06-12T01:35:47.828Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/yarn.png" alt="YARN工作原理"></p><h3 id="一-YARN组成元素及其功能"><a href="#一-YARN组成元素及其功能" class="headerlink" title="一 YARN组成元素及其功能"></a>一 YARN组成元素及其功能</h3><p>RM:YARN的管理者<br>NM:YARN的执行者</p><h3 id="二-YARN工作原理"><a href="#二-YARN工作原理" class="headerlink" title="二 YARN工作原理"></a>二 YARN工作原理</h3><p>首先数据上传到集群中.然后将写好的程序打成架包通过命令提交MR作业.提交到集群后由集群管理者MR开始调度分配资源.到HDFS读取数据执行MapReduce相关进程对数据进行计算</p><h2 id="三-具体流程"><a href="#三-具体流程" class="headerlink" title="三 具体流程"></a>三 具体流程</h2><p>第一步: Client执行main()函数中runjob();开启作业</p><p>第二步:client向RM发送作业请求同时RM将作业id以及jar包存放路径返回给Client</p><p>第三步:Client会把Jar路径为前缀作业id为后缀作为唯一存放路径,将jar包写入到HDFS集群中,默认情况下jar包写10份,而其他数据只写3份 当改程序运行完后删除这些数据</p><p>第四步:Client再次将Jar存放地址(更为详细的描述)提交给RM.</p><p>第五步:RM将其放入调度器,向NM发送命令,NM开启MRAPPMaster进程,MR根据HDFS中jar包数据量为NM分配任务.</p><p>第六步:NM通过心跳机制接受调度器分配的任务</p><p>第七步:NM会开启内部YARNChild </p><p>第八步:YARNChild根据命令到HDFS检索作业资源,</p><p>第九步:YARNChild开启MapTask 或者Reduce Task</p><p>第十步:map计算YARNChild调度的数据.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;/images/yarn.png&quot; alt=&quot;YARN工作原理&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;一-YARN组成元素及其功能&quot;&gt;&lt;a href=&quot;#一-YARN组成元素及其功能&quot; class=&quot;headerlink&quot; title=&quot;一 YARN组成元素及其功
      
    
    </summary>
    
      <category term="YARN" scheme="https://huashishaojie.github.io/categories/YARN/"/>
    
    
      <category term="hadoop" scheme="https://huashishaojie.github.io/tags/hadoop/"/>
    
      <category term="YARN" scheme="https://huashishaojie.github.io/tags/YARN/"/>
    
  </entry>
  
  <entry>
    <title>使用hexo和git实现多地更新和配置博客源文件</title>
    <link href="https://huashishaojie.github.io/2018/06/03/%E4%BD%BF%E7%94%A8hexo%E5%92%8Cgit%E5%AE%9E%E7%8E%B0%E5%A4%9A%E5%9C%B0%E6%9B%B4%E6%96%B0%E5%92%8C%E9%85%8D%E7%BD%AE%E5%8D%9A%E5%AE%A2%E6%BA%90%E6%96%87%E4%BB%B6/"/>
    <id>https://huashishaojie.github.io/2018/06/03/使用hexo和git实现多地更新和配置博客源文件/</id>
    <published>2018-06-03T05:03:48.000Z</published>
    <updated>2019-05-30T05:07:18.879Z</updated>
    
    <content type="html"><![CDATA[<p>使用hexo写博客的一个问题就是源文件都是在本地的，如果换了电脑需要更新博客时就会比较麻烦。目前，觉得比较靠谱的办法就是用github来管理了。</p><ul><li>主要的思路是 利用git分支实现</li><li>hexo生成的静态博客文件默认放在master分支上。</li><li>hexo的源文件（部署环境文件）可以都放在hexo分支上（可以新创建一个hexo分支），换新电脑时，直接git clone hexo分支</li></ul><h2 id="一、hexo搭建博客原理"><a href="#一、hexo搭建博客原理" class="headerlink" title="一、hexo搭建博客原理"></a>一、hexo搭建博客原理</h2><ul><li>hexo帮助把博客发送到github，同时把md文件转换成网页文件。</li><li>hexo目录下的文件和github上的文件是不同的，public文件夹的文件通过hexo d 上传到github去了，其他的文件则留在本地目录下。<h2 id="二、搭建hexo服务器端电脑设置"><a href="#二、搭建hexo服务器端电脑设置" class="headerlink" title="二、搭建hexo服务器端电脑设置"></a>二、搭建hexo服务器端电脑设置</h2><h3 id="1-准备工作"><a href="#1-准备工作" class="headerlink" title="1.准备工作"></a>1.准备工作</h3>首先确保自己已经使用hexo在github搭建好了自己的个人博客。<h3 id="2-对username-github-io仓库新建hexo分支，并克隆"><a href="#2-对username-github-io仓库新建hexo分支，并克隆" class="headerlink" title="2.对username.github.io仓库新建hexo分支，并克隆"></a>2.对username.github.io仓库新建hexo分支，并克隆</h3></li><li>在Github的username.github.io仓库上新建一个xxx分支，并切换到该分支，并在该仓库-&gt;Settings-&gt;Branches-&gt;Default branch中将默认分支设为xxx，save保存；然后将该仓库克隆到本地，进入该username.github.io文件目录。</li></ul><p>完成上面步骤后，在当前目录使用Git Bash执行git branch命令查看当前所在分支，应为新建的分支xxx：</p><h3 id="3-将本地博客的部署文件拷贝进username-github-io文件目录"><a href="#3-将本地博客的部署文件拷贝进username-github-io文件目录" class="headerlink" title="3.将本地博客的部署文件拷贝进username.github.io文件目录"></a>3.将本地博客的部署文件拷贝进username.github.io文件目录</h3><ul><li>如题，先将本地博客的部署文件（Hexo目录下的全部文件）全部拷贝进username.github.io文件目录中去。</li></ul><p>接下来，进入username.github.io文件目录下，将该目录下的全部文件提交到xxx分支，提交之前需注意：</p><ul><li>将themes目录以内中的主题的.git目录删除（如果有），因为一个git仓库中不能包含另一个git仓库，提交主题文件夹会失败。</li><li>可能有人会问，删除了themes目录中的.git不就不能git pull更新主题了吗，很简单，需要更新主题时在另一个地方git clone下来该主题的最新版本，然后将内容拷到当前主题目录即可。<h3 id="4-提交hexo分支"><a href="#4-提交hexo分支" class="headerlink" title="4.提交hexo分支"></a>4.提交hexo分支</h3></li><li>执行git add .、git commit -m ‘back up hexo files’（引号内容可改）、git push即可将博客的hexo部署环境提交到GitHub个人仓库的xxx分支。</li></ul><p>现在可以在GitHub上的username.github.io仓库看到两个分支的差异了。<br>master分支和xxx分支各自保存着一个版本，master分支用于保存博客静态资源，提供博客页面供人访问；xxx分支用于备份博客部署文件，供自己维护更新，两者在一个GitHub仓库内互不冲突。</p><h2 id="三、其他任何一台电脑"><a href="#三、其他任何一台电脑" class="headerlink" title="三、其他任何一台电脑"></a>三、其他任何一台电脑</h2><p>至此，你的博客已经可以在其他电脑上进行同步的维护和更新了，方法很简单：</p><ul><li>将新电脑的生成的ssh key添加到GitHub账户上</li><li>在新电脑上克隆username.github.io仓库的xxx分支到本地，此时本地git仓库处于xxx分支</li><li>切换到username.github.io目录，执行npm install(由于仓库有一个.gitignore文件，里面默认是忽略掉 node_modules文件夹的，也就是说仓库的hexo分支并没有存储该目录[也不需要]，所以需要install下)</li><li>到这里了就可以开始在自己的电脑上写博客了！</li></ul><p>编辑、撰写文章或其他博客更新改动：</p><ul><li>依次执行git add .、git commit -m ‘back up hexo files’（引号内容可改）、git push指令，保证xxx分支版本最新</li><li>执行hexo d -g指令（在此之前，有时可能需要执行hexo clean），完成后就会发现，最新改动已经更新到master分支了，两个分支互不干扰！<h2 id="四、回到hexo服务器端电脑更新并提交博客"><a href="#四、回到hexo服务器端电脑更新并提交博客" class="headerlink" title="四、回到hexo服务器端电脑更新并提交博客"></a>四、回到hexo服务器端电脑更新并提交博客</h2><strong>注意： 每次换电脑进行博客更新时，不管上次在其他电脑有没有更新，最好先git pull</strong></li><li><p>按照之前的方法写自己博客</p></li><li><p>然后将目录切换下username.github.io下，此时需要安装一下npm install， 最后执行hexo g、hexo s、hexo d等命令即可提交成功.</p></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;使用hexo写博客的一个问题就是源文件都是在本地的，如果换了电脑需要更新博客时就会比较麻烦。目前，觉得比较靠谱的办法就是用github来管理了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主要的思路是 利用git分支实现&lt;/li&gt;
&lt;li&gt;hexo生成的静态博客文件默认放在master分支
      
    
    </summary>
    
      <category term="hexo" scheme="https://huashishaojie.github.io/categories/hexo/"/>
    
    
      <category term="Git" scheme="https://huashishaojie.github.io/tags/Git/"/>
    
      <category term="Hexo" scheme="https://huashishaojie.github.io/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>MapReduce Shuffle 和 Spark Shuffle 详解</title>
    <link href="https://huashishaojie.github.io/2018/05/30/MapReduce-Shuffle-%E5%92%8C-Spark-Shuffle-%E8%AF%A6%E8%A7%A3/"/>
    <id>https://huashishaojie.github.io/2018/05/30/MapReduce-Shuffle-和-Spark-Shuffle-详解/</id>
    <published>2018-05-30T14:52:15.000Z</published>
    <updated>2019-06-12T01:35:22.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Shuffle简介"><a href="#Shuffle简介" class="headerlink" title="Shuffle简介"></a>Shuffle简介</h2><p>shuffle的本意是洗牌、混洗的意思，把一组有规则的数据尽量打乱成无规则的数据。而在MapReduce中，Shuffle更像是洗牌的逆过程，指的是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据，以便reduce端接收处理。其在MapReduce中所处的工作阶段是map输出后到reduce接收前，具体可以分为map端和reduce端前后两个部分。<br>在shuffle之前，也就是在map阶段，MapReduce会对要处理的数据进行分片（split）操作，为每一个分片分配一个MapTask任务。接下来map会对每一个分片中的每一行数据进行处理得到键值对（key,value）此时得到的键值对又叫做“中间结果”。此后便进入reduce阶段，由此可以看出Shuffle阶段的作用是处理“中间结果”。<br>由于Shuffle涉及到了磁盘的读写和网络的传输，因此Shuffle性能的高低直接影响到了整个程序的运行效率。</p><h2 id="MapReduce-Shuffle"><a href="#MapReduce-Shuffle" class="headerlink" title="MapReduce Shuffle"></a>MapReduce Shuffle</h2><h3 id="Map端的shuffle"><a href="#Map端的shuffle" class="headerlink" title="Map端的shuffle"></a>Map端的shuffle</h3><p>下图是MapReduce Shuffle的官方流程：<br><img src="/images/map_shuffle.png" alt="Map端的Shuffle"><br>因为频繁的磁盘I/O操作会严重的降低效率，因此“中间结果”不会立马写入磁盘，而是优先存储到map节点的“环形内存缓冲区”，在写入的过程中进行分区（partition），也就是对于每个键值对来说，都增加了一个partition属性值，然后连同键值对一起序列化成字节数组写入到缓冲区（缓冲区采用的就是字节数组，默认大小为100M）。<br>当写入的数据量达到预先设置的阙值后便会启动溢写出线程将缓冲区中的那部分数据溢出写（spill）到磁盘的临时文件中，并在写入前根据key进行排序（sort）和合并（combine，可选操作）。<br>溢出写过程按轮询方式将缓冲区中的内容写到mapreduce.cluster.local.dir属性指定的本地目录中。当整个map任务完成溢出写后，会对磁盘中这个map任务产生的所有临时文件（spill文件）进行归并（merge）操作生成最终的正式输出文件，此时的归并是将所有spill文件中的相同partition合并到一起，并对各个partition中的数据再进行一次排序（sort），生成key和对应的value-list，文件归并时，如果溢写文件数量超过参数min.num.spills.for.combine的值（默认为3）时，可以再次进行合并。<br>至此map端的工作已经全部结束，最终生成的文件也会存储在TaskTracker能够访问的位置。每个reduce task不间断的通过RPC从JobTracker那里获取map task是否完成的信息，如果得到的信息是map task已经完成，那么Shuffle的后半段开始启动。</p><h3 id="Reduce端的shuffle"><a href="#Reduce端的shuffle" class="headerlink" title="Reduce端的shuffle"></a>Reduce端的shuffle</h3><p>当mapreduce任务提交后，reduce task就不断通过RPC从JobTracker那里获取map task是否完成的信息，如果获知某台TaskTracker上的map task执行完成，Shuffle的后半段过程就开始启动。Reduce端的shuffle主要包括三个阶段，copy、merge和reduce。<br>每个reduce task负责处理一个分区的文件，以下是reduce task的处理流程：<br><img src="/images/reduce_shuffle.jpg" alt="Reduce端的shuffle"></p><ul><li>reduce task从每个map  task的结果文件中拉取对应分区的数据。因为数据在map阶段已经是分好区了，并且会有一个额外的索引文件记录每个分区的起始偏移量。所以reduce task取数的时候直接根据偏移量去拉取数据就ok。</li><li>reduce task从每个map task拉取分区数据的时候会进行再次合并，排序，按照自定义的reducer的逻辑代码去处理。</li><li>最后就是Reduce过程了，在这个过程中产生了最终的输出结果，并将其写到HDFS上。<h4 id="为什么要排序"><a href="#为什么要排序" class="headerlink" title="为什么要排序"></a>为什么要排序</h4>key存在combine操作，排序之后相同的key放到一块显然方便做合并操作。<br>reduce task是按key去处理数据的。 如果没有排序那必须从所有数据中把当前相同key的所有value数据拿出来，然后进行reduce逻辑处理。显然每个key到这个逻辑都需要做一次全量数据扫描，影响性能，有了排序很方便的得到一个key对于的value集合。<br>reduce task按key去处理数据时，如果key按顺序排序，那么reduce task就按key顺序去读取，显然当读到的key是文件末尾的key那么就标志数据处理完毕。如果没有排序那还得有其他逻辑来记录哪些key处理完了，哪些key没有处理完。<br>虽有千万种理由需要这么做，但是很耗资源，并且像排序其实我们有些业务并不需要排序。<h4 id="为什么要文件合并"><a href="#为什么要文件合并" class="headerlink" title="为什么要文件合并"></a>为什么要文件合并</h4>因为内存放不下就会溢写文件，就会发生多次溢写，形成很多小文件，如果不合并，显然会小文件泛滥，集群需要资源开销去管理这些小文件数据。<br>任务去读取文件的数增多，打开的文件句柄数也会增多。<br>mapreduce是全局有序。单个文件有序，不代表全局有序，只有把小文件合并一起排序才会全局有序。<h2 id="Spark-Shuffle"><a href="#Spark-Shuffle" class="headerlink" title="Spark Shuffle"></a>Spark Shuffle</h2></li><li>Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分，并将数据发送给对应的 Reducer 的过程。</li><li>Shuffle作为处理连接map端和reduce端的枢纽，其shuffle的性能高低直接影响了整个程序的性能和吞吐量。map端的shuffle一般为shuffle的Write阶段，reduce端的shuffle一般为shuffle的read阶段。Hadoop和spark的shuffle在实现上面存在很大的不同，spark的shuffle分为两种实现，分别为HashShuffle和SortShuffle。</li><li>HashShuffle又分为普通机制和合并机制，普通机制因为其会产生MR个数的巨量磁盘小文件而产生大量性能低下的Io操作，从而性能较低，因为其巨量的磁盘小文件还可能导致OOM，HashShuffle的合并机制通过重复利用buffer从而将磁盘小文件的数量降低到CoreR个，但是当Reducer端的并行任务或者是数据分片过多的时候，依然会产生大量的磁盘小文件。</li><li>SortShuffle也分为普通机制和bypass机制，普通机制在内存数据结构(默认为5M)完成排序，会产生2M个磁盘小文件。而当shuffle<br>map task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。或者算子不是聚合类的shuffle算子(比如reduceByKey)的时候会触发SortShuffle的bypass机制，SortShuffle的bypass机制不会进行排序，极大的提高了其性能。</li><li>在Spark1.2以前，默认的shuffle计算引擎是HashShuffleManager，因为HashShuffleManager会产生大量的磁盘小文件而性能低下，在Spark<br>1.2以后的版本中，默认的ShuffleManager改成了SortShuffleManager。</li><li>SortShuffleManager相较于HashShuffleManager来说，有了一定的改进。主要就在于，每个Task在进行shuffle操作时，虽然也会产生较多的临时磁盘文件，但是最后会将所有的临时文件合并(merge)成一个磁盘文件，因此每个Task就只有一个磁盘文件。在下一个stage的shuffle read task拉取自己的数据时，只要根据索引读取每个磁盘文件中的部分数据即可。<h2 id="Spark与MapReduce-Shuffle的异同"><a href="#Spark与MapReduce-Shuffle的异同" class="headerlink" title="Spark与MapReduce Shuffle的异同"></a>Spark与MapReduce Shuffle的异同</h2></li><li>从整体功能上看，两者并没有大的差别。 都是将 mapper（Spark 里是 ShuffleMapTask）的输出进行partition，不同的 partition 送到不同的 reducer（Spark 里 reducer 可能是下一个 stage 里的ShuffleMapTask，也可能是 ResultTask）。Reducer 以内存作缓冲区，边 shuffle 边 aggregate 数据，等到数据 aggregate 好以后进行 reduce（Spark 里可能是后续的一系列操作）。</li><li>从流程的上看，两者差别不小。 Hadoop MapReduce 是 sort-based，进入 combine和 reduce的records 必须先 sort。这样的好处在于combine/reduce可以处理大规模的数据，因为其输入数据可以通过外排得到（mapper 对每段数据先做排序，reducer 的shuffle 对排好序的每段数据做归并）。以前 Spark 默认选择的是 hash-based，通常使用 HashMap 来对shuffle 来的数据进行合并，不会对数据进行提前排序。如果用户需要经过排序的数据，那么需要自己调用类似sortByKey的操作。在Spark 1.2之后，sort-based变为默认的Shuffle实现。</li><li>从流程实现角度来看，两者也有不少差别。 Hadoop MapReduce 将处理流程划分出明显的几个阶段：map, spill, merge, shuffle, sort, reduce等。每个阶段各司其职，可以按照过程式的编程思想来逐一实现每个阶段的功能。在Spark 中，没有这样功能明确的阶段，只有不同的 stage 和一系列的 transformation，所以 spill, merge,aggregate 等操作需要蕴含在 transformation中。</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;Shuffle简介&quot;&gt;&lt;a href=&quot;#Shuffle简介&quot; class=&quot;headerlink&quot; title=&quot;Shuffle简介&quot;&gt;&lt;/a&gt;Shuffle简介&lt;/h2&gt;&lt;p&gt;shuffle的本意是洗牌、混洗的意思，把一组有规则的数据尽量打乱成无规则的数据。而
      
    
    </summary>
    
      <category term="Hadoop" scheme="https://huashishaojie.github.io/categories/Hadoop/"/>
    
    
      <category term="hadoop" scheme="https://huashishaojie.github.io/tags/hadoop/"/>
    
      <category term="spark" scheme="https://huashishaojie.github.io/tags/spark/"/>
    
      <category term="shuffle" scheme="https://huashishaojie.github.io/tags/shuffle/"/>
    
  </entry>
  
  <entry>
    <title>HDFS原理</title>
    <link href="https://huashishaojie.github.io/2018/05/28/HDFS%E5%8E%9F%E7%90%86/"/>
    <id>https://huashishaojie.github.io/2018/05/28/HDFS原理/</id>
    <published>2018-05-28T12:02:28.000Z</published>
    <updated>2019-06-12T01:35:03.778Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;随着互联网的发展，数据日益增多，增长超过了单机能够处理的上线，数据如何存储和处理成为了科技公司的难题，随着google的三篇论文的发布，大家终于找到了一个方案-分布式文件系统+MapReduce。Hadoop是参考google论文实现的，集成了分布式文件系统与分布式批处理平台。hadoop的设计目标是用来解决大文件海量存储和批处理的，为了避免单个节点故障导致数据丢失，设计副本冗余机制。 本文将主要分析一下几个方面：</p><ul><li>HDFS的概念与架构</li><li>读写流程分析</li><li>使用场景与缺点</li></ul><h2 id="HDFS的概念与架构"><a href="#HDFS的概念与架构" class="headerlink" title="HDFS的概念与架构"></a>HDFS的概念与架构</h2><p>HDFS采用的master/slave架构。一个HDFS集群通常由一个Active的NameNode和若干DataNode组成，为了避免NameNode单点问题，通常会做一个NameNode的standby作为备份。在整个hdfs涉及到许多的核心概念，下面做一个简单介绍：</p><ul><li>NameNode：<br>NameNode是一个中心服务器，负责管理文件系统的名字空间以及客户端的访问，比如文件的打卡、关闭、重命名文件或者目录。它负责确定数据块到具体的存储节点的映射。在其同意调度下进行数据块的创建、删除、复制。</li><li>DataNode: DataNode是HDFS的实际存储节点，负责管理它所在节点的存储；客户端的读写请求。并且定期上报心跳和块的存储位置。</li><li>Block: HDFS上文件，从其内部看，一个文件其实是被分成一个或者多个数据块存储的，这些数据块存储在一组DataNode上。</li><li>Edits: 在HDFS发起的创建、删除等操作其实是一个事物，事物在NameNode上以Edit对象存储在edits文件中，持久化在NameNode的本地磁盘上。</li><li>FSimage: FSimage是NameNode的元数据存储快照，持久化在NameNode的本地磁盘上。</li></ul><p>当NameNode重启的时候，NameNode从FSImage和Edits文件中读取数据，加载到内存中。</p><p>在HDFS体系来看，NameNode主要负责元数据的存储与操作，DataNode负责实际的存储。DataNode通常在一个机器上部署一个进程，这些机器分布式在多个机架上。整体架构如下图所示：<br><img src="/images/hdfs-architecture.png" alt="HDFS架构"></p><h2 id="HDFS的读写流程"><a href="#HDFS的读写流程" class="headerlink" title="HDFS的读写流程"></a>HDFS的读写流程</h2><h3 id="读流程分析"><a href="#读流程分析" class="headerlink" title="读流程分析"></a>读流程分析</h3><p><img src="/images/hdfs_read.png" alt="HDFS读流程"></p><ul><li>客户端打开文件，通过rpc的方式向NameNode获取文件块的存储位置信息，NameNode会将文件中的各个块的所有副本DataNode全部返回，这些DataNode会按照与客户端的位置的距离排序。如果客户端就是在DataNode上，客户端可以直接从本地读取文件，跳过网络IO，性能更高。</li><li>客户端调用read方法，存储了文件的前几个块的地址的DFSInputStream，就会连接存储了第一个块的最近的DataNode。然后通过DFSInputStream就通过重复调用read()方法，数据就从DataNode流动到客户端，当DataNode的最后一个块读取完成了，DFSInputSteam会关闭与DataNode的连接，然后寻找下一个快的最佳节点。这个过程读客户端来说透明的，在客户端那边来看们就像是只读取了一个连续不断的流。</li><li>块是按顺序读的，通过 DFSInputStream 在 datanode 上打开新的连接去作为客户端读取的流。他也将会通过namenode<br>来获取下一批所需要的块所在的 datanode 的位置(注意刚才说的只是从 namenode 获取前几个块的)。当客户端完成了读取，就在FSDataInputStream 上调用 close() 方法结束整个流程。</li></ul><p>在这个设计中一个重要的方面就是客户端直接从 DataNode 上检索数据，并通过 NameNode 指导来得到每一个块的最佳    DataNode。这种设计允许 HDFS 扩展大量的并发客户端，因为数据传输只是集群上的所有 DataNode    展开的。期间，NameNode    仅仅只需要服务于获取块位置的请求（块位置信息是存放在内存中，所以效率很高）。如果不这样设计，随着客户端数据量的增长，数据服务就会很快成为一个瓶颈。 </p><h3 id="写流程分析"><a href="#写流程分析" class="headerlink" title="写流程分析"></a>写流程分析</h3><p><img src="/images/hdfs_write.png" alt="HDFS写流程"></p><ul><li>通过Client向远程的NameNode发送RPC请求；</li><li>接收到请求后NameNode会首先判断对应的文件是否存在以及用户是否有对应的权限，成功则会为文件创建一个记录，否则会让客户端抛出异常；</li><li>当客户端开始写入文件的时候，开发库会将文件切分成多个packets，并在内部以”data<br>queue”的形式管理这些packets，并向Namenode申请新的blocks，获取用来存储replicas的合适的datanodes列表，列表的大小根据在Namenode中对replication的设置而定。</li><li>开始以pipeline（管道）的形式将packet写入所有的replicas中。开发库把packet以流的方式写入第一个<br>datanode，该datanode把该packet存储之后，再将其传递给在此pipeline中的下一个datanode，直到最后一个<br>datanode， 这种写数据的方式呈流水线的形式。</li><li>最后一个datanode成功存储之后会返回一个ack packet，在pipeline里传递至客户端，在客户端的开发库内部维护着 “ack<br>queue”，成功收到datanode返回的ack packet后会从”ack queue”移除相应的packet。</li><li>如果传输过程中，有某个datanode出现了故障，那么当前的pipeline会被关闭，出现故障的datanode会从当前的<br>pipeline中移除，剩余的block会继续剩下的datanode中继续以pipeline的形式传输，同时Namenode会分配一个新的<br>datanode，保持replicas设定的数量。</li></ul><h2 id="HDFS的使用场景和缺点"><a href="#HDFS的使用场景和缺点" class="headerlink" title="HDFS的使用场景和缺点"></a>HDFS的使用场景和缺点</h2><h3 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a>使用场景</h3><p>hdfs的设计一次写入，多次读取，支持修改。</p><p>大文件，在hdfs中一个块通常是64M、128M、256M，小文件会占用更多的元数据存储，增加文件数据块的寻址时间。</p><p>延时高，批处理。</p><p>高容错，多副本。</p><h3 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h3><p>延迟比较高，不适合低延迟高吞吐率的场景</p><p>不适合小文件，小文件会占用NameNode的大量元数据存储内存，并且增加寻址时间</p><p>支持并发写入，一个文件只能有一个写入者</p><p>不支持随机修改，仅支持append</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&amp;emsp;随着互联网的发展，数据日益增多，增长超过了单机能够处理的上线，数据如何存储和处理成为了科技公司的难题，随着google的三篇论文的发布，大家终于找到了一个方案-分布式文件系统+MapReduce。Hadoop是参考google论文实现的，集成了分布式文件系统与分
      
    
    </summary>
    
      <category term="HDFS" scheme="https://huashishaojie.github.io/categories/HDFS/"/>
    
    
      <category term="HDFS" scheme="https://huashishaojie.github.io/tags/HDFS/"/>
    
      <category term="hadoop" scheme="https://huashishaojie.github.io/tags/hadoop/"/>
    
  </entry>
  
  <entry>
    <title>安装Metron</title>
    <link href="https://huashishaojie.github.io/2018/05/27/%E5%AE%89%E8%A3%85Metron/"/>
    <id>https://huashishaojie.github.io/2018/05/27/安装Metron/</id>
    <published>2018-05-27T11:19:25.000Z</published>
    <updated>2019-05-29T01:40:32.816Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-Metron简介"><a href="#1-Metron简介" class="headerlink" title="1.Metron简介"></a>1.Metron简介</h3><p><a href="https://github.com/apache/metron" rel="nofollow" target="_blank">Metron</a>是一种多功能的安全遥测数据捕获、流分析和威胁响应平台，最早由Cisco公司的开源大数据系统安全框架项目OpenSOC迁移为Metron项目，现已晋升为Apache顶级项目。Metron提供的功能包括：日志的聚合、对网络包全面捕获的索引和存储、高级行为分析及数据浓缩，并可以将当前的威胁情报信息应用到安全遥测中。从概念上可划分为四个组件：数据捕获与摄取、实时数据处理、受保证的数据持久化和存储、用于驱动监控和风险报警服务的机器学习模型。</p><h3 id="2-Metron架构及功能"><a href="#2-Metron架构及功能" class="headerlink" title="2.Metron架构及功能"></a>2.Metron架构及功能</h3><p>&nbsp;</p><h3 id="3、安装Metron"><a href="#3、安装Metron" class="headerlink" title="3、安装Metron"></a>3、安装Metron</h3><p>1）基础环境及版本</p><p>&nbsp; &nbsp; &nbsp; &nbsp;CentOS 7</p><p>&nbsp; &nbsp; &nbsp; &nbsp;Metron 0.4.1</p><p>&nbsp; &nbsp; &nbsp; &nbsp;HDP 2.5</p><p>Hosts:<br><br>192.168.11.90&nbsp; node1<br><br>192.168.11.103 node2<br><br>192.168.11.104 node3</p><p>1)添加epel repository 并更新系统:</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">yum <span class="hljs-keyword">install</span> epel-<span class="hljs-keyword">release</span> -y</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">yum <span class="hljs-keyword">update</span> -y</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>2）配置各节点间的免秘钥登录，具体参考：<a href="https://mp.csdn.net/postedit/81384217" rel="nofollow" target="_blank">https://mp.csdn.net/postedit/81384217</a></p><p>3）在将要安装ES和Storm的节点上增加ElasticSearch和Storm的限制（若不确定安装节点，则在所有节点上增加限制）</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby">echo -e <span class="hljs-string">"elasticsearch - memlock unlimited\nstorm - nproc 257597"</span> <span class="hljs-meta">&gt;&gt; </span>/etc/security/limits.conf</code><div class="hljs-button" data-title="复制"></div></pre><p>4）调整限制以确保安全级别</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs bash"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">ulimit</span> -n 32768</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">ulimit</span> -u 65536</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">echo</span> -e <span class="hljs-string">"* - nofile 32768\n* - nproc 65536"</span> &gt;&gt; /etc/security/limits.conf</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>5）禁用IPv6，启用它可能会强制服务仅绑定到IPv6地址，从而导致无法连接到IPv6</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs php"><ol class="hljs-ln" style="width:1013px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">sysctl -w net.ipv6.conf.all.disable_ipv6=<span class="hljs-number">1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">sysctl -w net.ipv6.conf.<span class="hljs-keyword">default</span>.disable_ipv6=<span class="hljs-number">1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">echo</span> -e <span class="hljs-string">"\n# Disable IPv6\nnet.ipv6.conf.all.disable_ipv6 = 1\nnet.ipv6.conf.default.disable_ipv6 = 1"</span> &gt;&gt; /etc/sysctl.conf</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>6）禁用Transparent Hugepage（Transparent HugePages是RHEL6的新特性）</p><p>在kernel配置文件（/etc/ default / grub）的末尾添加“transparent_hugepage = never”，并重新启动(reboot)。</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs python"><ol class="hljs-ln" style="width:928px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># 修改行:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">GRUB_CMDLINE_LINUX=<span class="hljs-string">"crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># 为:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">GRUB_CMDLINE_LINUX=<span class="hljs-string">"crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet transparent_hugepage=never"</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>之后，执行：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs">grub2-mkconfig -o /boot/grub2/grub.cfg</code><div class="hljs-button" data-title="复制"></div></pre><p>重启后检查是否已应用更改（确保在方括号中选择“never”字样）</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">cat /sys/kernel/mm/transparent_hugepage/enabled</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">always madvise [never]</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>备注：若不想搞乱内核参数，可以创建一个新的systemd服务，在每次启动时禁用它。方法如下：</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 创建文件“/etc/systemd/system/disable-thp.service”：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs cs"><ol class="hljs-ln" style="width:1167px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-meta">Unit</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Description=<span class="hljs-function"><span class="hljs-function">Disable Transparent Huge <span class="hljs-title">Pages</span> (<span class="hljs-params">THP</span>)</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function"> </span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function">[Service]</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function">Type</span>=simple</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ExecStart=/bin/sh -c <span class="hljs-string">"echo 'never' &gt; /sys/kernel/mm/transparent_hugepage/enabled &amp;&amp; echo 'never' &gt; /sys/kernel/mm/transparent_hugepage/defrag"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-meta">Install</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">WantedBy=multi-user.target</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp; &nbsp;重新启动systemd，启动新服务并确保新服务在启动时运行：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs python"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># systemctl daemon-reload</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># systemctl start disable-thp</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># systemctl enable disable-thp</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>7）禁用SELinux（Ambari和Metron必需条件）：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs java"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">setenforce <span class="hljs-number">0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">sed -i <span class="hljs-string">'s/SELINUX=enforcing/SELINUX=disabled/g'</span> /etc/selinux/config</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p><strong>Metron安装准备</strong></p><p>(1)在所有节点上安装Ambari的先决条件：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln" style="width:1229px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">yum <span class="hljs-keyword">install</span> git wget curl rpm tar unzip scp bzip2 wget createrepo yum-utils ntp python-pip psutils python-psutil ntp libffi-devel gcc openssl-devel -y</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">pip <span class="hljs-keyword">install</span> <span class="hljs-comment">--upgrade pip</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">pip <span class="hljs-keyword">install</span> requests</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>备注：yum 安装 scp 报错：</p><p><img alt class="has" src="https://img-blog.csdn.net/20180803152923263?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEyMjA5NjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70"></p><p>原因：yum 不存在独立的scp 包，scp属于openssh-clients这个包。</p><p>解决方案：安装openssh-clients 即可</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> openssh-clients</code><div class="hljs-button" data-title="复制"></div></pre><p>(2)在Metron节点上安装java 1.8（若不确定Metron安装节点，在所有节点上安装Java1.8）：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs css"><span class="hljs-selector-tag">yum</span> <span class="hljs-selector-tag">install</span> <span class="hljs-selector-tag">java-1</span><span class="hljs-selector-class">.8</span><span class="hljs-selector-class">.0-openjdk</span> <span class="hljs-selector-tag">java-1</span><span class="hljs-selector-class">.8</span><span class="hljs-selector-class">.0-openjdk-devel</span> <span class="hljs-selector-tag">-y</span></code><div class="hljs-button" data-title="复制"></div></pre><p>(3)设置Java环境变量：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs javascript"><span class="hljs-keyword">export</span> JAVA_HOME=$(readlink -f /usr/bin/java | sed <span class="hljs-string">"s_/jre/bin/java__"</span>)</code><div class="hljs-button" data-title="复制"></div></pre><p>(4)保存java环境变量，以备重启时使用：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs bash"><ol class="hljs-ln" style="width:890px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">echo</span> <span class="hljs-string">'export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s_/jre/bin/java__")'</span> &gt; /etc/profile.d/java_18.sh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">chmod +x /etc/profile.d/java_18.sh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">source</span> /etc/profile.d/java_18.sh</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>(5)下载并安装Maven 3.3.9:</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">wget <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/archive.apache.org/dist</span><span class="hljs-regexp">/maven/maven</span>-<span class="hljs-number">3</span>/<span class="hljs-number">3.3</span>.<span class="hljs-number">9</span>/binaries/apache-maven-<span class="hljs-number">3.3</span>.<span class="hljs-number">9</span>-bin.tar.gz</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">tar -zxf apache-maven-<span class="hljs-number">3.3</span>.<span class="hljs-number">9</span>-bin.tar.gz</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mv apache-maven-<span class="hljs-number">3.3</span>.<span class="hljs-number">9</span> /opt</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">PATH=<span class="hljs-regexp">/opt/apache</span>-maven-<span class="hljs-number">3.3</span>.<span class="hljs-number">9</span>/<span class="hljs-symbol">bin:</span>$PATH</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">echo <span class="hljs-string">'export PATH=/opt/apache-maven-3.3.9/bin:$PATH'</span> &gt; <span class="hljs-regexp">/etc/profile</span>.d/maven.sh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">chmod +x /etc/profile.d/maven.sh</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>(6)检查Maven是否安装成功：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs bash"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">source</span> /etc/profile.d/maven.sh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mvn -V</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>若安装成功，执行结果如下：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby"><ol class="hljs-ln" style="width:5424px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># mvn -V</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Apache Maven <span class="hljs-number">3.3</span>.<span class="hljs-number">9</span> (bb52d8502b132ec0a5a3f4c09453c07478323dc5; <span class="hljs-number">2015</span>-<span class="hljs-number">11</span>-<span class="hljs-number">10</span><span class="hljs-symbol">T08:</span><span class="hljs-number">41</span><span class="hljs-symbol">:</span><span class="hljs-number">47</span>-08<span class="hljs-symbol">:</span><span class="hljs-number">00</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Maven <span class="hljs-symbol">home:</span> /opt/apache-maven-<span class="hljs-number">3.3</span>.<span class="hljs-number">9</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Java <span class="hljs-symbol">version:</span> <span class="hljs-number">1.8</span>.<span class="hljs-number">0_131</span>, <span class="hljs-symbol">vendor:</span> Oracle Corporation</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Java <span class="hljs-symbol">home:</span> /usr/lib/jvm/java-<span class="hljs-number">1.8</span>.<span class="hljs-number">0</span>-openjdk-<span class="hljs-number">1.8</span>.<span class="hljs-number">0</span>.<span class="hljs-number">131</span>-<span class="hljs-number">3</span>.b12.el7_3.x86_64/jre</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Default <span class="hljs-symbol">locale:</span> en_US, platform <span class="hljs-symbol">encoding:</span> UTF-<span class="hljs-number">8</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">OS <span class="hljs-symbol">name:</span> <span class="hljs-string">"linux"</span>, <span class="hljs-symbol">version:</span> <span class="hljs-string">"3.10.0-514.16.1.el7.x86_64"</span>, <span class="hljs-symbol">arch:</span> <span class="hljs-string">"amd64"</span>, <span class="hljs-symbol">family:</span> <span class="hljs-string">"unix"</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] Scanning <span class="hljs-keyword">for</span> projects...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] ------------------------------------------------------------------------</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] BUILD FAILURE</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] ------------------------------------------------------------------------</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] Total <span class="hljs-symbol">time:</span> <span class="hljs-number">0</span>.083 s</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] Finished <span class="hljs-symbol">at:</span> <span class="hljs-number">2017</span>-<span class="hljs-number">06</span>-<span class="hljs-number">06</span><span class="hljs-symbol">T09:</span><span class="hljs-number">59</span><span class="hljs-symbol">:</span><span class="hljs-number">03</span>-<span class="hljs-number">07</span><span class="hljs-symbol">:</span><span class="hljs-number">00</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] Final <span class="hljs-symbol">Memory:</span> <span class="hljs-number">13</span>M/<span class="hljs-number">479</span>M</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[INFO] ------------------------------------------------------------------------</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR] No goals have been specified <span class="hljs-keyword">for</span> this build. You must specify a valid lifecycle phase <span class="hljs-keyword">or</span> a goal <span class="hljs-keyword">in</span> the format &lt;plugin-prefix&gt;<span class="hljs-symbol">:&lt;goal&gt;</span> <span class="hljs-keyword">or</span> &lt;plugin-group-id&gt;<span class="hljs-symbol">:&lt;plugin-artifact-id&gt;</span>[<span class="hljs-symbol">:&lt;plugin-version&gt;</span>]<span class="hljs-symbol">:&lt;goal&gt;</span>. Available lifecycle phases <span class="hljs-symbol">are:</span> validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -&gt; [Help <span class="hljs-number">1</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR] Re-run Maven using the -X switch to enable full debug logging.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR] For more information about the errors <span class="hljs-keyword">and</span> possible solutions, please read the following <span class="hljs-symbol">articles:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ERROR] [Help <span class="hljs-number">1</span>] <span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/cwiki.apache.org/confluence</span><span class="hljs-regexp">/display/</span>MAVEN/NoGoalSpecifiedException</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>(7) 在Ambari节点上安装并启用docker(需要使用docker为Ambari创建Metron包)</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">yum <span class="hljs-keyword">install</span> docker-io -y</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">start</span> docker</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>(8)在打包节点上安装nmp，这是构建metron-config所必需的，它是UI的一部分。</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> npm -y</code><div class="hljs-button" data-title="复制"></div></pre><p>(9)在 /etc/hosts文件中添加：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="language-bash hljs">127.0.0.1 localhost</code><div class="hljs-button" data-title="复制"></div></pre><p>(10)在主节点上安装数据库，以备Metron REST使用：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> mariadb-<span class="hljs-keyword">server</span> -y</code><div class="hljs-button" data-title="复制"></div></pre><p>(11)&nbsp;在所有节点上安装JAVA MySQL连接器：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> mysql-connector-<span class="hljs-keyword">java</span> -y</code><div class="hljs-button" data-title="复制"></div></pre><p><strong>配置Metron REST数据库</strong></p><p>安装数据库后运行”mysql_secure_installation”进行初始安全设置：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">start</span> mariadb</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">enable</span> mariadb</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">status</span> mariadb</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql_secure_installation # </div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p id="Metron0.4.1withHDP2.5bare-metalinstallonCentos7withMariaDBforMetronREST-BuildMetroncode"><strong>打包 Metron code</strong></p><p>1)从github上克隆Metron repo并切换到0.4.1版本：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs php"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">git <span class="hljs-keyword">clone</span> https:<span class="hljs-comment">//github.com/apache/metron</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">cd metron</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">git checkout Metron_0<span class="hljs-number">.4</span><span class="hljs-number">.1</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>2)使用HDP 2.5构建Metron：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs bash"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">cd</span> metron</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mvn clean package -DskipTests -T 2C -P HDP-2.5.0.0,mpack</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">cd</span> metron-deployment/packaging/docker/rpm-docker</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mvn clean install -DskipTests -PHDP-2.5.0.0</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp;备注：如果rpm-docker失败并报错如下：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs">/bin/bash：./build.sh：Permission denied</code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp; &nbsp;请禁用selinux后重试&nbsp;</p><p>3)在所有节点上，创建localrepo目录并从Ambari节点复制RPM：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs perl"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">mkdir</span> /localrepo</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">cp -rp /root/metron/metron-deployment/packaging/docker/rpm-docker/RPMS/noarch/* <span class="hljs-regexp">/localrepo/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">createrepo /localrepo</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp; &nbsp;备注：如果多节点安装，还要将软件包复制到其他节点：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ssh root@node2 mkdir /localrepo</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">scp /localrepo/*rpm root@node2<span class="hljs-symbol">:/localrepo/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ssh root@node2 createrepo /localrepo</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>4) 为Hadoop服务获取并创建logrotate脚本：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs java"><ol class="hljs-ln" style="width:1375px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">wget -O /etc/logrotate.d/metron-ambari https:<span class="hljs-comment">//raw.githubusercontent.com/apache/metron/master/metron-deployment/roles/ambari_common/templates/metron-hadoop-logrotate.yml</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">sed -i <span class="hljs-string">'s/^  .*$/  daily/'</span> /etc/logrotate.d/metron-ambari</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">sed -i <span class="hljs-string">'s/^  rotate .*$/  rotate 30/'</span> /etc/logrotate.d/metron-ambari</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">chmod <span class="hljs-number">0644</span> /etc/logrotate.d/metron-ambari</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p><strong>安装Ambari</strong></p><p>（1）首先，在每个节点上时间同步，禁用防火墙和SElinux</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl enable ntpd</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">start</span> ntpd</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -P <span class="hljs-keyword">INPUT</span> <span class="hljs-keyword">ACCEPT</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -P FORWARD <span class="hljs-keyword">ACCEPT</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -P <span class="hljs-keyword">OUTPUT</span> <span class="hljs-keyword">ACCEPT</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -t nat -F</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -t mangle -F</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -F</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables -X</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">iptables-<span class="hljs-keyword">save</span> &gt; /etc/sysconfig/iptables</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">stop</span> firewalld</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">systemctl <span class="hljs-keyword">disable</span> firewalld</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">setenforce <span class="hljs-number">0</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>备注：如果使用的是CentOS 7和Python 2.7.5及更高版本，则在Ambari UI中安装ambari代理时会遇到错误：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs css"><span class="hljs-selector-attr">[SSL: CERTIFICATE_VERIFY_FAILED]</span> <span class="hljs-selector-tag">certificate</span> <span class="hljs-selector-tag">verify</span> <span class="hljs-selector-tag">failed</span> (_<span class="hljs-selector-tag">ssl</span><span class="hljs-selector-class">.c</span><span class="hljs-selector-pseudo">:579)</span></code><div class="hljs-button" data-title="复制"></div></pre><p>解决办法：要修复它，请在Python中禁用cert检查</p><p>参考：<a href="https://community.hortonworks.com/questions/120861/ambari-agent-ssl-certificate-verify-failed-certifi.html" rel="nofollow" target="_blank">https://community.hortonworks.com/questions/120861/ambari-agent-ssl-certificate-verify-failed-certifi.html</a></p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs java">sed -i <span class="hljs-string">'s/verify=platform_default/verify=disable/'</span> /etc/python/cert-verification.cfg</code><div class="hljs-button" data-title="复制"></div></pre><p>（2）确保每个节点都可以解析每个其他节点的主机名，即将每个节点的主机名添加到/etc/hosts</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs css"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">10<span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.1</span> <span class="hljs-selector-tag">node1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">10<span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.2</span> <span class="hljs-selector-tag">node2</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">10<span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.3</span> <span class="hljs-selector-tag">node3</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">10<span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.4</span> <span class="hljs-selector-tag">node4</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>（3）在主节点下载和设置Ambari repo（可以用更新的Ambari版本号替换”2.4.3.0”）</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby">wget -nv <span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/public-repo-1.hortonworks.com/ambari</span><span class="hljs-regexp">/centos7/</span><span class="hljs-number">2</span>.x/updates/<span class="hljs-number">2.4</span>.<span class="hljs-number">3.0</span>/ambari.repo -O /etc/yum.repos.d/ambari.repo</code><div class="hljs-button" data-title="复制"></div></pre><p>（4）检查是否添加成功：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs perl"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">yum repolist | <span class="hljs-keyword">grep</span> ambari</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># Updates-ambari-2.4.3.0   ambari-2.4.3.0 - Updates </span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>（5）制作本地yum源：</p><p>&nbsp; &nbsp; a、首先下载包含必要软件的压缩包（tarball）到本地，以CentOS7，Ambari 2.4.3和HDP 2.5.0.0为例：</p><p>Ambari-2.4.3.0 压缩包地址：</p><p><a href="http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.4.3.0/ambari-2.4.3.0-centos7.tar.gz" rel="nofollow" target="_blank">http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.4.3.0/ambari-2.4.3.0-centos7.tar.gz</a></p><p>HDP-2.5.0.0压缩包地址：</p><p><a href="http://public-repo-1.hortonworks.com/HDP/centos7/2.x/updates/2.5.0.0/HDP-2.5.0.0-centos7-rpm.tar.gz" rel="nofollow" target="_blank">http://public-repo-1.hortonworks.com/HDP/centos7/2.x/updates/2.5.0.0/HDP-2.5.0.0-centos7-rpm.tar.gz</a></p><p>HDP UTILS压缩包下载地址：</p><p><a href="http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.21/repos/centos7/HDP-UTILS-1.1.0.21-centos7.tar.gz" rel="nofollow" target="_blank">http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.21/repos/centos7/HDP-UTILS-1.1.0.21-centos7.tar.gz</a></p><p>其他版本，下载地址请参考：</p><p>Ambari：</p><p><a href="http://docs.hortonworks.com/HDPDocuments/Ambari-2.4.1.0/bk_ambari-installation/content/ambari_repositories.html" rel="nofollow" target="_blank">http://docs.hortonworks.com/HDPDocuments/Ambari-2.4.1.0/bk_ambari-installation/content/ambari_repositories.html</a></p><p>HDP和HDP UTILS：</p><p><a href="http://docs.hortonworks.com/HDPDocuments/Ambari-2.4.1.0/bk_ambari-installation/content/hdp_stack_repositories.html" rel="nofollow" target="_blank">http://docs.hortonworks.com/HDPDocuments/Ambari-2.4.1.0/bk_ambari-installation/content/hdp_stack_repositories.html</a></p><p>b、设置本地库，我们先需要完成一些准备工作，如下：</p><p><ol><li>选择一台机器作为本地库的镜像服务器，这个机器能够被集群中的机器所访问，且有一个被支持的操作系统。</li><br>    <li>此台镜像服务器有软件包管理，例如centOS的yum。</li><br></ol></p><p>c、在镜像服务器上安装一个HTTP服务（例如Apache httpd）</p><p></p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> httpd</code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp;启动web 服务：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs perl"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[root@master ~]<span class="hljs-comment"># systemctl start httpd</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[root@master ~]<span class="hljs-comment"># systemctl enable httpd</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp;d、把下载到的3个资源文件，并解压到http服务（web服务）目录下：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs python"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># mkdir /var/www/html/ambari-hdp</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># mkdir /var/www/html/ambari-hdp/HDP-UTILS</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># tar -xvf ambari-2.4.1.0-centos7.tar.gz -C /var/www/html/ambari-hdp/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># tar -xvf HDP-2.5.0.0-centos7-rpm.tar.gz -C /var/www/html/ambari-hdp/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># tar -xvf HDP-UTILS-1.1.0.21-centos7.tar.gz -C /var/www/html/ambari-hdp/HDP-UTILS</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>e、&nbsp;确认解压目录正常，在浏览器中确认是否可以访问，访问地址如下：</p><p>Ambari Base URL：<a href="http://172.16.16.183:82/ambari-hdp/centos7/" rel="nofollow" target="_blank">http://172.16.16.183:82/ambari-hdp/centos7/</a></p><p>HDP Base URL：<a href="http://172.16.16.183:82/ambari-hdp/HDP/centos7/" rel="nofollow" target="_blank">http://172.16.16.183:82/ambari-hdp/HDP/centos7/</a></p><p>HDP-UTILS Base URL：<a href="http://172.16.16.183:82/ambari-hdp/HDP-UTILS/" rel="nofollow" target="_blank">http://172.16.16.183:82/ambari-hdp/HDP-UTILS/</a></p><p id="3配置yum本地源">f、配置Yum本地Repos资源池（在每台node上）</p><p>安装插件：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> yum-<span class="hljs-keyword">plugin</span>-priorities</code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp;编辑<code>/etc/yum/pluginconf.d/priorities.conf</code>&nbsp;文件添加如下配置:</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs cs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-meta">main</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">enabled=<span class="hljs-number">1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgcheck=<span class="hljs-number">0</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p id="32-制作本地资源文件">制作本地资源文件，创建Ambari、HDP、HDP-UTIL资源文件：</p><p><ul><li>&nbsp; ambari.repo</li><br></ul><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln" style="width:875px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[ambari-<span class="hljs-number">2.4</span>.<span class="hljs-number">1.0</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">name</span>=ambari-<span class="hljs-number">2.4</span>.<span class="hljs-number">1.0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">baseurl=http:<span class="hljs-comment">//192.168.0.203/ambari-hdp/AMBARI-2.4.1.0/centos7/2.4.1.0-22/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgcheck=<span class="hljs-number">0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgkey=http:<span class="hljs-comment">//192.168.0.203/ambari-hdp/AMBARI-2.4.1.0/centos7/2.4.1.0-22/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">enabled=<span class="hljs-number">1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">priority=<span class="hljs-number">1</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></p><p><ul><li>&nbsp; hdp.repo</li><br></ul><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[HDP-<span class="hljs-number">2.5</span>.<span class="hljs-number">0.0</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">name</span>=Hortonworks Data <span class="hljs-keyword">Platform</span> Version - HDP-<span class="hljs-number">2.5</span>.<span class="hljs-number">0.0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">baseurl=http:<span class="hljs-comment">//192.168.0.203/ambari-hdp/HDP/centos7</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgcheck=<span class="hljs-number">0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgkey=http:<span class="hljs-comment">//192.168.0.203/ambari-hdp/HDP/centos7/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">enabled=<span class="hljs-number">1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">priority=<span class="hljs-number">1</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></p><p><ul><li>&nbsp;&nbsp;hdp-util.repo</li><br></ul><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[HDP-UTILS-<span class="hljs-number">1.1</span>.<span class="hljs-number">0.21</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">name</span>=Hortonworks Data <span class="hljs-keyword">Platform</span> Version - HDP-UTILS-<span class="hljs-number">1.1</span>.<span class="hljs-number">0.21</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">baseurl=http:<span class="hljs-comment">//192.168.0.203/ambari-hdp/HDP-UTILS/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgcheck=<span class="hljs-number">0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">gpgkey=http:<span class="hljs-comment">//192.168.0.203/ambari-hdp/HDP-UTILS/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">enabled=<span class="hljs-number">1</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">priority=<span class="hljs-number">1</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></p><p>&nbsp; &nbsp;查看资源池：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs css"><ol class="hljs-ln" style="width:1113px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  <span class="hljs-selector-attr">[root@master yum.repos.d]</span># <span class="hljs-selector-tag">yum</span> <span class="hljs-selector-tag">repolist</span> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  <span class="hljs-selector-tag">repo</span> <span class="hljs-selector-tag">id</span>                                          <span class="hljs-selector-tag">repo</span> <span class="hljs-selector-tag">name</span>                                                                     <span class="hljs-selector-tag">status</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  <span class="hljs-selector-tag">HDP-2</span><span class="hljs-selector-class">.5</span>                                          <span class="hljs-selector-tag">HDP-2</span><span class="hljs-selector-class">.5</span>                                                                        0+200</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  <span class="hljs-selector-tag">HDP-2</span><span class="hljs-selector-class">.5</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span>                                      <span class="hljs-selector-tag">Hortonworks</span> <span class="hljs-selector-tag">Data</span> <span class="hljs-selector-tag">Platform</span> <span class="hljs-selector-tag">Version</span> <span class="hljs-selector-tag">-</span> <span class="hljs-selector-tag">HDP-2</span><span class="hljs-selector-class">.5</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span>                                  200</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  <span class="hljs-selector-tag">HDP-UTILS-1</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.21</span>                               <span class="hljs-selector-tag">HDP-UTILS-1</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.21</span>                                                                64</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  <span class="hljs-selector-tag">ambari-2</span><span class="hljs-selector-class">.4</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-class">.0</span>                                   <span class="hljs-selector-tag">ambari-2</span><span class="hljs-selector-class">.4</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-class">.0</span>   </div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>（5）安装和设置Ambari server：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs sql">yum <span class="hljs-keyword">install</span> ambari-<span class="hljs-keyword">server</span> -y</code><div class="hljs-button" data-title="复制"></div></pre><p>安装完成后创建ambari数据库及用户，登录root用户执行下面语句：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; create database ambari character <span class="hljs-keyword">set</span> utf8;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; CREATE USER <span class="hljs-string">'ambari'</span>@<span class="hljs-string">'%'</span> IDENTIFIED BY <span class="hljs-string">'ambari'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; GRANT ALL PRIVILEGES <span class="hljs-keyword">ON</span> *.* <span class="hljs-keyword">TO</span> <span class="hljs-string">'ambari'</span>@<span class="hljs-string">'%'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; FLUSH PRIVILEGES;</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>如果要安装Hive，再创建Hive数据库和用户 再执行下面的语句：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; create database hive character <span class="hljs-keyword">set</span> utf8;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; CREATE USER <span class="hljs-string">'hive'</span>@<span class="hljs-string">'%'</span> IDENTIFIED BY <span class="hljs-string">'hive'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; GRANT ALL PRIVILEGES <span class="hljs-keyword">ON</span> *.* <span class="hljs-keyword">TO</span> <span class="hljs-string">'hive'</span>@<span class="hljs-string">'%'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; FLUSH PRIVILEGES;</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>如果要安装Oozie，再创建Oozie数据库和用户 再执行下面的语句：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; create database oozie character <span class="hljs-keyword">set</span> utf8;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; CREATE USER <span class="hljs-string">'oozie'</span>@<span class="hljs-string">'%'</span> IDENTIFIED BY <span class="hljs-string">'oozie'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; GRANT ALL PRIVILEGES <span class="hljs-keyword">ON</span> *.* <span class="hljs-keyword">TO</span> <span class="hljs-string">'oozie'</span>@<span class="hljs-string">'%'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; FLUSH PRIVILEGES; </div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>（6） 配置Ambari-Server</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs perl"><ol class="hljs-ln" style="width:1590px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[root@node-<span class="hljs-number">1</span> ~]<span class="hljs-comment"># ambari-server setup</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Using python  /usr/bin/python</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Setup ambari-server</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Checking SELinux...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">SELinux status is <span class="hljs-string">'disabled'</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Customize user account <span class="hljs-keyword">for</span> ambari-server daemon [<span class="hljs-regexp"><span class="hljs-regexp">y/n] (n)? y</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Enter user account for ambari-server daemon (root):ambari  </span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Adjusting ambari-server permissions and ownership...</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Checking firewall status...</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Checking JDK...</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">[2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">[3] Custom JDK</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">==============================================================================</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Enter choice (1): 3</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">WARNING: JDK must be installed on all hosts and JAVA_HOME must be valid on all hosts.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">WARNING: JCE Policy files are required for configuring Kerberos security. If you plan to use Kerberos,please make sure JCE Unlimited Strength Jurisdiction Policy Files are valid on all hosts.</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Path to JAVA_HOME: /usr/lib</span><span class="hljs-regexp">/jvm/java</span>-<span class="hljs-number">1.8</span>.<span class="hljs-number">0</span>-openjdk-<span class="hljs-number">1.8</span>.<span class="hljs-number">0</span>.<span class="hljs-number">161</span>-<span class="hljs-number">0</span>.b14.el7_4.x86_64/jre  <span class="hljs-comment"># 填写java_home</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Validating JDK on Ambari Server...done.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Checking GPL software agreement...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">GPL License <span class="hljs-keyword">for</span> LZO: https:<span class="hljs-regexp">//www</span>.gnu.org/licenses/old-licenses/gpl-<span class="hljs-number">2.0</span>.en.html</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Enable Ambari Server to download <span class="hljs-keyword">and</span> install GPL Licensed LZO packages [<span class="hljs-regexp"><span class="hljs-regexp">y/n] (n)? n</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Completing setup...</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Configuring database...</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Enter advanced database configuration [y/n] (n)? y  </span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Configuring database...</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">==============================================================================</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">Choose one of the following options:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">[1] - PostgreSQL (Embedded)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">[2] - Oracle</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-regexp">[3] - MySQL /</span> MariaDB</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-number">4</span>] - PostgreSQL</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-number">5</span>] - Microsoft SQL Server (Tech Preview)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-number">6</span>] - SQL Anywhere</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-number">7</span>] - BDB</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">==============================================================================</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Enter choice (<span class="hljs-number">1</span>): <span class="hljs-number">3</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Hostname (localhost): </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Port (<span class="hljs-number">3306</span>): </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Database name (ambari): </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Username (ambari): </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Enter Database Password (bigdata): </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Configuring ambari database...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">WARNING: Before starting Ambari Server, you must copy the MySQL JDBC driver JAR file to /usr/share/java <span class="hljs-keyword">and</span> set property <span class="hljs-string">"server.jdbc.driver.path=[path/to/custom_jdbc_driver]"</span> in ambari.properties.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Press &lt;enter&gt; to continue.</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp;到上面一步时，提示需要配置mysql的 jdbc驱动，并修改Ambari配置文件，指定jdbc驱动文件位置：</p><p>在安装Metron准备(11)步骤时我们安装了JAVA MySQL连接器其默认路径为（/usr/share/java/）,所以我们只需要在Ambari配置文件中添加jdbc驱动文件位置即可，即在编辑/etc/ambari-server/conf/ambari.properties添加如下配置：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby">server.jdbc.driver.path=<span class="hljs-regexp">/usr/share</span><span class="hljs-regexp">/java/mysql</span>-connector-java.jar</code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp;配置完成后继续，会出现如下提示：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs vbscript"><ol class="hljs-ln" style="width:1413px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Press &lt;enter&gt; <span class="hljs-keyword">to</span> continue.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Configuring remote database connection properties...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">WARNING: Before starting Ambari <span class="hljs-built_in">Server</span>, you must run the following DDL against the database <span class="hljs-keyword">to</span> create the schema: /var/lib/ambari-<span class="hljs-built_in">server</span>/resources/Ambari-DDL-MySQL-CREATE.sql</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Proceed <span class="hljs-keyword">with</span> configuring remote database connection properties [y/n] (y)? </div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp;出现上述提示时，根据信息导入数据库：将Ambari数据库脚本导入到数据库。Ambari安装会将安装等信息写入数据库，建议使用自己安装的MySQL数据库，也可以不安装而使用默认数据库PostgreSQL。如果使用自己定义的数据库，必须在启动Ambari服务之前导入Ambari的sql脚本。</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs php"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># mysql -uroot -p</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; <span class="hljs-keyword">use</span> <span class="hljs-title">ambari</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">mysql&gt; source /<span class="hljs-keyword">var</span>/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql;</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>（6）通过运行mpack命令将Metron服务添加到Ambari（确保在–mpack =中指定正确的mpack路径）：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs ruby">ambari-server install-mpack --mpack=<span class="hljs-regexp">/root/metron</span><span class="hljs-regexp">/metron-deployment/packaging</span><span class="hljs-regexp">/ambari/metron</span>-mpack/target/metron_mpack-<span class="hljs-number">0</span>.<span class="hljs-number">4.1</span>.<span class="hljs-number">0</span>.tar.gz --verbose</code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp;（7）启动Ambari服务</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs vbscript">ambari-<span class="hljs-built_in">server</span> start</code><div class="hljs-button" data-title="复制"></div></pre><p>（8）服务启动成功后，会监听8080端口，通过在Web浏览器中访问Ambari UI：http://&lt;Ambari_server_ip&gt;:8080/，账号密码admin/admin正常登录，则安装完成。结果如下图所示（图片来自网络，仅供参考）：</p><p><img alt class="has" src="http://i2.51cto.com/images/blog/201801/29/de25e22ae0bef09664aa09fea0fbca28.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk="></p><p>（9）创建集群</p><p>使用ambari的web界面可完成对集群的所有管理操作，创建一个实例集群。</p><p><img alt class="has" src="http://i2.51cto.com/images/blog/201801/29/08181bd4ab480f4cad6f1c15eec6509d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk="></p><p>&nbsp;选择本地源，移除不必要的版本：</p><p><img alt class="has" src="http://i2.51cto.com/images/blog/201801/29/a630d9d505c8abdfd89c3bf9ca5e8ba7.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk="></p><p>&nbsp;设置本地源为以上步骤中制作的本地源：</p><p>Base URL：ambari ：<a href="http://172.16.16.183:82/ambari-hdp/ambari/centos7/" rel="nofollow" target="_blank">http://172.16.16.183:82/ambari-hdp/ambari/centos7/</a></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HDP ：<a href="http://172.16.16.183:82/ambari-hdp/HDP/centos7/" rel="nofollow" target="_blank">http://172.16.16.183:82/ambari-hdp/HDP/centos7/</a></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HDP-UTILS：<a href="http://172.16.16.183:82/ambari-hdp/HDP-UTILS/" rel="nofollow" target="_blank">http://172.16.16.183:82/ambari-hdp/HDP-UTILS/</a></p><p>及Metron 源采用本地源：file:////localrepo/repodata</p><p>添加主机节点，上传（Ambari server 节点的）id_rsa文件：<br><img alt="使用Ambari搭建Hadoop集群" class="has" src="http://i2.51cto.com/images/blog/201801/29/aff975d197c31422291a840ae1e88699.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk="></p><p>（9）安装Ambari agent，组建集群，如下图所示（由于在安装过程中不仅需要从本地HDP及Metron配置的源中下载文件还需要联网下载文件所以需要时间较长，且有时会因为网络超时导致安装失败，可能需要多次重试，请周知）：</p><p><img alt class="has" src="https://img-blog.csdn.net/20160222130857077?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"></p><p>&nbsp;在安装过程中，ambari注册主机的时候，ambari-agent出现如下错误：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs css"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-selector-tag">NetUtil</span><span class="hljs-selector-class">.py</span><span class="hljs-selector-pseudo">:96</span> <span class="hljs-selector-tag">-</span> <span class="hljs-selector-tag">EOF</span> <span class="hljs-selector-tag">occurred</span> <span class="hljs-selector-tag">in</span> <span class="hljs-selector-tag">violation</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">protocol</span> (_<span class="hljs-selector-tag">ssl</span><span class="hljs-selector-class">.c</span><span class="hljs-selector-pseudo">:579)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-selector-tag">NetUtil</span><span class="hljs-selector-class">.py</span><span class="hljs-selector-pseudo">:97</span> <span class="hljs-selector-tag">-</span> <span class="hljs-selector-tag">SSLError</span>: <span class="hljs-selector-tag">Failed</span> <span class="hljs-selector-tag">to</span> <span class="hljs-selector-tag">connect</span>. <span class="hljs-selector-tag">Please</span> <span class="hljs-selector-tag">check</span> <span class="hljs-selector-tag">openssl</span> <span class="hljs-selector-tag">library</span> <span class="hljs-selector-tag">versions</span>.</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>有两种可能：</p><p>第一是有可能如前面所提到的使用的是centos7、python 2.7.5及以上版本的python 会在安装Ambari agent时报错：</p><p><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><br>            <p><code>[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (<a href="https://cwiki.apache.org/confluence/display/METRON/_ssl.c:" rel="nofollow" target="_blank">_ssl.c:</a></code><code>579</code><code>)</code></p><br>            </td><br>        </tr></tbody></table></p><p>解决办法是：要解决此问题，即在此处禁用Python中的证书检查</p><p></p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs java"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">sed -i <span class="hljs-string">'s/verify=platform_default/verify=disable/'</span> /etc/python/cert-verification.cfg</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>第二是Ambari agent安全验证引起的；</p><p>解决方案 在ambari-agent的配置文件ambari-agent.ini 在 ［security］增加一项</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs cs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">[<span class="hljs-meta">security</span>] </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">force_https_protocol=PROTOCOL_TLSv1_2</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>2.如出现bootstrap、stack-recommendations 目录找不到的错误：</p><p>解决方案：</p><p>进入/var/run/ambari-server,手动创建bootstrap文件夹，并对其添加owner为ambari：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs perl"><span class="hljs-keyword">chown</span> ambari bootstrap</code><div class="hljs-button" data-title="复制"></div></pre><p>然后重启Ambari server</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs vbscript">ambari-<span class="hljs-built_in">server</span> restart</code><div class="hljs-button" data-title="复制"></div></pre><p>安装成功后，会显示如下界面：<br><img alt="使用Ambari搭建Hadoop集群" class="has" src="http://i2.51cto.com/images/blog/201801/29/fc8afe696331bd77c006d778b5cc9855.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk="><br><br>（9）使用Ambari安装其他组件</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a.首先，输入集群任意集群名称；</p><p>&nbsp; &nbsp; &nbsp; &nbsp; b.选择版本：确保选中”Public Repository”。您还应该看到列出的/localrepo目录。</p><p>&nbsp; &nbsp; &nbsp; &nbsp;c.设置安装选项：在”Target Hosts”中指定安装Ambari集群的节点的主机名（/ etc / hosts中指定的所有节点）。在”Host Registration Information”中复制主节点私钥（/root/.ssh/id_rsa）的内容。如果收到警告”以下主机名无效FQDN”，请忽略它并单击”确定”。</p><p>&nbsp; &nbsp; &nbsp; &nbsp;d.选择服务：选择以下服务：</p><p><img alt="使用Ambari搭建Hadoop集群" class="has" src="http://i2.51cto.com/images/blog/201801/29/7ac6d3d687749ed0aba42cea8827ccf4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=">&nbsp;&nbsp;</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">HDFS</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">YARN + MapReduce2</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Tez</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">HBase</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Pig</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Zookeeper</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Storm</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Flume</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Ambari Metrics</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Kafka</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Elasticsearch</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Kibana</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Metron</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Slider</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">OpenTAXII</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Pycapa</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Zeppelin Notebook</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Hive</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp; e.分配Masters:在所有节点上分配”Kafka Broker”，确保在一个公共节点上安装以下组件：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs vbscript"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Storm UI <span class="hljs-built_in">Server</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Metron Indexing</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">MySQL <span class="hljs-built_in">Server</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Kibana <span class="hljs-built_in">Server</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Elasticsearch Master</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Metron Parsers</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Metron Enrichment</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp; f.&nbsp;分配Slaves和Clients：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">DataNode</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">NodeManager</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">RegionServer</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Supervisor</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Client</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>&nbsp; &nbsp; &nbsp; g.自定义服务：以下是需要配置的服务列表：</p><p>(1)在HDFS - &gt; Configs下将”NameNode Java堆大小”（namenode_heapsize）从默认的1024 MB设置为至少4096 MB。</p><p>(2)对于ElasticSearch：<br><br>将”zen_discovery_ping_unicast_hosts”设置为在Assign Master选项卡上分配ElasticSearch Master的节点的IP。<br><br>在”Advanced elastic-site”下：将”network_host”更改为”0.0.0.0”。如果Metron暴露在公共互联网上，请不要这样做！现在是“[<em>local</em>，_ site_]”。<br><br>(3)对于Kibana：<br><br>将”kibana_es_url”设置为http:// &lt;elasticsearch_master_hostname&gt;:9200。elasticsearch_master_hostname是”&nbsp;Assign Master&nbsp;”选项卡上分配ElasticSearch Master的节点的IP。<br><br>将”kibana_default_application”更改为”dashboard / Metron-Dashboard”<br><br>(4)对于Metron：将”Elasticsearch Hosts”设置为在Assign Master选项卡上分配ElasticSearch Master的节点的IP。<br><br>(5)对于Storm：将”supervisor.slots.ports”的数量从默认的[6700,6701]增加到[6700,6701,6702,6703,6704]如果只安装一个节点。<br><br>(6)对于metron REST使用：<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Metron JDBC客户端路径：/usr/share/java/mysql-connector-java.jar<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Metron JDBC驱动程序：com.mysql.jdbc.Driver<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Metron JDBC密码：&lt;DB PASSWORD&gt;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Metron JDBC平台：mysql<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Metron JDBC URL：jdbc：mysql：//127.0.0.1：3306 / &lt;DB NAME&gt;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Metron JDBC用户名：&lt;DB USERNAME&gt;</p><p>(7)将其余配置值设置为Ambari推荐的或您想要的配置值（如DB密码）并执行安装。在只有3个节点，集群安装如下：</p><p><table><thead><tr><th scope="col"><br>            <p>node1</p><br>            </th><br>            <th scope="col"><br>            <p>node2</p><br>            </th><br>            <th scope="col"><br>            <p>node3</p><br>            </th><br>        </tr></thead><tbody><tr><td>DataNode</td><br>            <td>DataNode</td><br>            <td>DataNode</td><br>        </tr><tr><td>Elasticsearch Master</td><br>            <td>App Timeline Server</td><br>            <td><br>            <p>Elasticsearch Data Node</p><br>            </td><br>        </tr><tr><td colspan="1">Grafana</td><br>            <td colspan="1">Kafka Broker</td><br>            <td colspan="1">Metrics Monitor</td><br>        </tr><tr><td colspan="1">HBase Client</td><br>            <td colspan="1">DRPC Server</td><br>            <td colspan="1">Flume</td><br>        </tr><tr><td colspan="1">HBase Master</td><br>            <td colspan="1">HBase Client</td><br>            <td colspan="1">HBase Client</td><br>        </tr><tr><td colspan="1">HCat Client</td><br>            <td colspan="1">HCat Client</td><br>            <td colspan="1">HCat Client</td><br>        </tr><tr><td colspan="1">HDFS Client</td><br>            <td colspan="1">HDFS Client</td><br>            <td colspan="1">HDFS Client</td><br>        </tr><tr><td colspan="1">Hive Client</td><br>            <td colspan="1">Hive Client</td><br>            <td colspan="1">Hive Client</td><br>        </tr><tr><td colspan="1">Kafka Broker</td><br>            <td colspan="1">History Server</td><br>            <td colspan="1">Kafka Broker</td><br>        </tr><tr><td colspan="1">Kibana Server</td><br>            <td colspan="1">Hive Metastore</td><br>            <td colspan="1">MapReduce2 Client</td><br>        </tr><tr><td colspan="1">MapReduce2 Client</td><br>            <td colspan="1">HiveServer2</td><br>            <td colspan="1">Metrics Collector</td><br>        </tr><tr><td colspan="1">Metrics Monitor</td><br>            <td colspan="1">MapReduce2 Client</td><br>            <td colspan="1">Metron Client</td><br>        </tr><tr><td colspan="1">Metron Client</td><br>            <td colspan="1">Metrics Monitor</td><br>            <td colspan="1">NodeManager</td><br>        </tr><tr><td colspan="1">Metron Enrichment</td><br>            <td colspan="1">Metron Client</td><br>            <td colspan="1">Pig Client</td><br>        </tr><tr><td colspan="1">Metron Indexing</td><br>            <td colspan="1">MySQL Server</td><br>            <td colspan="1">Slider Client</td><br>        </tr><tr><td colspan="1">Metron Parsers</td><br>            <td colspan="1">Nimbus</td><br>            <td colspan="1">Spark Client</td><br>        </tr><tr><td colspan="1">Metron REST</td><br>            <td colspan="1">NodeManager</td><br>            <td colspan="1">Supervisor</td><br>        </tr><tr><td colspan="1">NameNode</td><br>            <td colspan="1">Pig Client</td><br>            <td colspan="1">Tez Client</td><br>        </tr><tr><td colspan="1">NodeManager</td><br>            <td colspan="1">ResourceManager</td><br>            <td colspan="1">YARN Client</td><br>        </tr><tr><td colspan="1">Pig Client</td><br>            <td colspan="1">NameNode</td><br>            <td colspan="1">ZooKeeper Client</td><br>        </tr><tr><td colspan="1"><br>            <p>RegionServer</p><br>            </td><br>            <td colspan="1">RegionServer</td><br>            <td colspan="1">RegionServer</td><br>        </tr><tr><td colspan="1">Slider Client</td><br>            <td colspan="1">Slider Client</td><br>            <td colspan="1">ZooKeeper Server</td><br>        </tr><tr><td colspan="1">Spark Client</td><br>            <td colspan="1">Spark Client</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">Spark History Server</td><br>            <td colspan="1">Supervisor</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">Storm UI Server</td><br>            <td colspan="1">Tez Client</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">Supervisor</td><br>            <td colspan="1">WebHCat Server</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">Tez Client</td><br>            <td colspan="1">YARN Client</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">YARN Client</td><br>            <td colspan="1">ZooKeeper Client</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">Zeppelin Notebook</td><br>            <td colspan="1">ZooKeeper Server</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">ZooKeeper Client</td><br>            <td colspan="1">&nbsp;</td><br>            <td colspan="1">&nbsp;</td><br>        </tr><tr><td colspan="1">ZooKeeper Server</td><br>            <td colspan="1">&nbsp;</td><br>            <td colspan="1">&nbsp;</td><br>        </tr></tbody></table></p><p>&nbsp;配置Metron REST，Metron REST可能无法工作，因为我们仍然需要将用户和数据库添加到MariaDB。此时，请确保所有服务都已启动，需要手动启动一些。</p><p></p><p>在MySQL中为Metron REST配置用户。在安装Metron REST UI的节点上，执行以下操作：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># mysql -u root -p</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CREATE USER <span class="hljs-string">'&lt;DB USERNAME&gt;'</span>@<span class="hljs-string">'localhost'</span> IDENTIFIED BY <span class="hljs-string">'&lt;DB PASSWORD&gt;'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">CREATE DATABASE <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> EXISTS &lt;DB <span class="hljs-keyword">NAME</span>&gt;;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">GRANT ALL PRIVILEGES <span class="hljs-keyword">ON</span> &lt;DB <span class="hljs-keyword">NAME</span>&gt;.* <span class="hljs-keyword">TO</span> <span class="hljs-string">'&lt;DB USERNAME&gt;'</span>@<span class="hljs-string">'localhost'</span>;</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>例如：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># mysql -u root -p</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; CREATE USER <span class="hljs-string">'metron'</span>@<span class="hljs-string">'localhost'</span> IDENTIFIED BY <span class="hljs-string">'metron'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; CREATE DATABASE <span class="hljs-keyword">IF</span> <span class="hljs-keyword">NOT</span> EXISTS metronrest;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; GRANT ALL PRIVILEGES <span class="hljs-keyword">ON</span> metronrest.* <span class="hljs-keyword">TO</span> <span class="hljs-string">'metron'</span>@<span class="hljs-string">'localhost'</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; quit</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Bye</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># </div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>在metron REST服务运行之前，我们需要做最后一步。 由于Centos 7中的systemd，服务metron-rest start &lt;PASSWORD&gt;不再有效。因此，必须编辑配置文件”/etc/rc.d/init.d/metron-rest”。 在此文件中，将METRON_JDBC_PASSWORD =”$2”更改为METRON_JDBC_PASSWORD =”&lt;DB PASSWORD&gt;”并通过Ambari界面重新启动metron-rest服务。</p><p>配置以下项时，请确保已启动Metron REST UI。</p><p>将Metron REST用户名和密码添加到metronrest数据库：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs cs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-meta"># mysql -u &lt;DB USERNAME&gt; -p</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; use &lt;DB NAME&gt;;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; <span class="hljs-function">insert <span class="hljs-keyword">into</span> <span class="hljs-title">users</span> (<span class="hljs-params">username, password, enabled</span>) <span class="hljs-title">values</span> (<span class="hljs-params"><span class="hljs-string">'&lt;USERNAME&gt;'</span>,<span class="hljs-string">'&lt;PASSWORD&gt;'</span>,<span class="hljs-number">1</span></span>)</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; <span class="hljs-function">insert <span class="hljs-keyword">into</span> <span class="hljs-title">authorities</span> (<span class="hljs-params">username, authority</span>) <span class="hljs-title">values</span> (<span class="hljs-params"><span class="hljs-string">'&lt;USERNAME&gt;'</span>, <span class="hljs-string">'ROLE_USER'</span></span>)</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; quit</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Bye</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-meta">#</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>例如：</p><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs cs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-meta"># mysql -u metron -p</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; use metronrest;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; <span class="hljs-function">insert <span class="hljs-keyword">into</span> <span class="hljs-title">users</span> (<span class="hljs-params">username, password, enabled</span>) <span class="hljs-title">values</span> (<span class="hljs-params"><span class="hljs-string">'metron'</span>,<span class="hljs-string">'metron'</span>,<span class="hljs-number">1</span></span>)</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; <span class="hljs-function">insert <span class="hljs-keyword">into</span> <span class="hljs-title">authorities</span> (<span class="hljs-params">username, authority</span>) <span class="hljs-title">values</span> (<span class="hljs-params"><span class="hljs-string">'metron'</span>, <span class="hljs-string">'ROLE_USER'</span></span>)</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">&gt; quit</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Bye</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-meta">#</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>确保所有服务都已启动。</p><p></p><p>&nbsp;</p>            <br>                <p></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;1-Metron简介&quot;&gt;&lt;a href=&quot;#1-Metron简介&quot; class=&quot;headerlink&quot; title=&quot;1.Metron简介&quot;&gt;&lt;/a&gt;1.Metron简介&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/apache/met
      
    
    </summary>
    
      <category term="Metron" scheme="https://huashishaojie.github.io/categories/Metron/"/>
    
    
      <category term="Metron" scheme="https://huashishaojie.github.io/tags/Metron/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://huashishaojie.github.io/2018/05/25/hello-world/"/>
    <id>https://huashishaojie.github.io/2018/05/25/hello-world/</id>
    <published>2018-05-25T06:15:48.000Z</published>
    <updated>2019-05-29T01:54:39.382Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.
      
    
    </summary>
    
    
  </entry>
  
</feed>
