【大數據面試寶典】 第一篇 Hadoop 面試題


  • Hadoop常見的端口
  • Hadoop生態圈
  • Hadoop配置文件以及簡單的Hadoop集群搭建
  • Hadoop參數調優
  • 項目經驗之基准測試
  • Hadoop宕機
  • Hadoop 高可用配置

Hadoop 常見的端口

 dfs.namenode.http-address:50070

 dfs.datanode.http-address:50075

 SecondaryNameNode輔助名稱節點端口號:50090

 dfs.datanode.address:50010

 fs.defaultFS:8020 或者9000

 yarn.resourcemanager.webapp.address:8088

 歷史服務器web訪問端口:19888

Hadoop 生態圈

Hadoop生態

Hadoop生態圈.png
然后就是各個組件的介紹了,簡單的介紹一下就好了。比如說:

  • Flume: 一個高可用的,高可靠的,分布式的海量數據日志采集,聚合和傳輸的系統;
  • Zookeeper: 是一個基於觀察者模式設計的分布式服務管理框架,他負責存儲和管理大家都關心的數據,然后接受管擦者的注冊,一旦這些數據的狀態發生了變化,Zookeeper就將負責通知已經在Zookeeper上注冊的觀察者做出相應的反應。

Hadoop配置文件以及簡單的Hadoop集群搭建

(1)配置文件:

core-site.xml

<configuration>
        <!-- 指定HDFS中NameNode的地址 -->
        <property>
                <name>fs.defaultFS</name>
                 <value>hdfs://master:9000</value>
        </property>

        <!-- 指定Hadoop運行時產生文件的存儲目錄 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/module/hadoop-2.7.2/data/tmp</value>
        </property>
        <!--配置 LZO -->
        <property>
           <name>io.compression.codecs</name>
           <value>
              org.apache.hadoop.io.compress.GzipCodec,
              org.apache.hadoop.io.compress.DefaultCodec,
              org.apache.hadoop.io.compress.BZip2Codec,
              org.apache.hadoop.io.compress.SnappyCodec,
              com.hadoop.compression.lzo.LzoCodec,
              com.hadoop.compression.lzo.LzopCodec
            </value>
        </property>

        <property>
            <name>io.compression.codec.lzo.class</name>
            <value>com.hadoop.compression.lzo.LzoCodec</value>
        </property>
        <!-- 設置壓縮格式 -->
        <property>
            <name>io.compression.codecs</name>
            <value>org.apache.hadoop.io.compress.SnappyCodec</value>
        </property>
</configuration>

hdfs-site.xml

<configuration>

    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

      <property>
          <name>dfs.image.transfer.timeout</name>
          <value>3600000</value>
          <description>如果對於某一次數據操作來講,延遲非常高,socket需要等待更長的時間,建議把該值設置為更大的值(默認60000毫秒),以確保socket不會被timeout掉。</description>
      </property>
        <!-- 指定Hadoop輔助名稱節點主機配置 -->
    <property>
         <name>dfs.namenode.secondary.http-address</name>
         <value>slave02:50090</value>
    </property>
<!--  如果 HDFS 上有一個節點突然斷了,就會出現數據無法寫入的情況,設置這兩個參數可以避免-->
    <property>
        <name>dfs.client.block.write.replace-datanode-on-failure.enable</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
        <value>NEVER</value>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <!-- 指定 mr 運行 在 yarn 上-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!-- 歷史服務器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>slave01:10020</value>
    </property>
    <!-- 歷史服務器web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>slave01:19888</value>
    </property>
    <property>
        <name>mapreduce.map.output.compress</name>
        <value>true</value>
    </property>
    <!-- map 端輸出的格式 -->
    <property>
        <name>mapreduce.map.output.compress.codec</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
        <!-- Reducer獲取數據的方式 -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <!-- 指定YARN的ResourceManager的地址 -->
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>slave01</value>
        </property>
        <!-- 日志保留時間設置7天 -->
        <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>604800</value>
        </property>

        <property>
             <name>yarn.nodemanager.vmem-check-enabled</name>
             <value>false</value>
        </property>
</configuration>

hadoop-env.sh,yarn-env.sh,mapred-env.sh這三個文件,我們主要配置一下 JAVA_HOME 的路徑。

slaves

這個文件,我們用於配置 DataNode 的節點。

master
slave01
slave02

(2)簡單的集群搭建過程:

  1. JDK安裝
  2. 配置SSH免密登錄
  3. 配置hadoop核心文件
  4. 格式化namenode

Hadoop參數調優

1)在hdfs-site.xml文件中配置多目錄,最好提前配置好,否則更改目錄需要重新啟動集群.

2)NameNode有一個工作線程池,用來處理不同DataNode的並發心跳以及客戶端並發的元數據操作. dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群規模為10台時,此參數設置為60.

3)編輯日志存儲路徑dfs.namenode.edits.dir設置與鏡像文件存儲路徑 dfs.namenode.name.dir 盡量分開,達到最低寫入延遲

4)服務器節點上YARN可使用的物理內存總量,默認是8192(MB),注意,如果你的節點內存資源不夠8GB,則需要調減小這個值,而YARN不會智能的探測節點的物理內存總量。yarn.nodemanager.resource.memory-mb

5)單個任務可申請的最多物理內存量,默認是8192(MB).yarn.scheduler.maximum-allocation-mb .

項目經驗之基准測試

搭建完Hadoop集群后需要對HDFS讀寫性能和MR計算能力測試。測試jar包在hadoop的share文件夾下。

Hadoop宕機

1)如果MR造成系統宕機。此時要控制Yarn同時運行的任務數,和每個任務申請的最大內存。調整參數:yarn.scheduler.maximum-allocation-mb(單個任務可申請的最多物理內存量,默認是8192MB)

2)如果寫入文件過量造成NameNode宕機。那么調高Kafka的存儲大小,控制從Kafka到HDFS的寫入速度。高峰期的時候用Kafka進行緩存,高峰期過去數據同步會自動跟上。

Hadoop 高可用配置

配置 HDFS-HA集群

  1. 配置core-site.xml
<configuration>
<!-- 把兩個NameNode)的地址組裝成一個集群mycluster -->
            <property>
                  <name>fs.defaultFS</name>
              <value>hdfs://mycluster</value>
            </property>

            <!-- 指定hadoop運行時產生文件的存儲目錄 -->
            <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/opt/ha/hadoop-2.7.2/data/tmp</value>
            </property>
</configuration>
  1. 配置 hdfs-site.xml
<configuration>
    <!-- 完全分布式集群名稱 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <!-- 集群中NameNode節點都有哪些 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop102:9000</value>
    </property>

    <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop103:9000</value>
    </property>

    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop102:50070</value>
    </property>

    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop103:50070</value>
    </property>

    <!-- 指定NameNode元數據在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
    </property>

    <!-- 配置隔離機制,即同一時刻只能有一台服務器對外響應 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>

    <!-- 使用隔離機制時需要ssh無秘鑰登錄-->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/corp/.ssh/id_rsa</value>
    </property>

    <!-- 聲明journalnode服務器存儲目錄-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/hadoop-2.7.2/data/jn</value>
    </property>

    <!-- 關閉權限檢查-->
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>

    <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
    <property>
          <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
</configuration>

再將我們的配置分發到各個節點上去。

配置HDFS-HA自動故障轉移

(1)在hdfs-site.xml中增加

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

(2)在core-site.xml文件中增加

<property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>

1)關閉所有HDFS服務:

sbin/stop-dfs.sh

(2)啟動Zookeeper集群:

bin/zkServer.sh start

(3)初始化HA在Zookeeper中狀態:

bin/hdfs zkfc -formatZK

(4)啟動HDFS服務:

sbin/start-dfs.sh

(5)在各個NameNode節點上啟動DFSZK Failover Controller,先在哪台機器啟動,哪個機器的NameNode就是Active NameNode

sbin/hadoop-daemin.sh start zkfc

配置Yarn-HA

Yarn-HA的工作機制:
yarn-ha
配置 yarn-site.xml 文件

<configuration>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--啟用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!--聲明兩台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop102</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop103</value>
    </property>
    <!--指定zookeeper集群的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
    </property>
    <!--啟用自動恢復-->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <!--指定resourcemanager的狀態信息存儲在zookeeper集群--> 
    <property>
        <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

</configuration>

啟動HDFS
(1)在各個JournalNode節點上,輸入以下命令啟動journalnode服務:

sbin/hadoop-daemon.sh start journalnode

(2)在[nn1]上,對其進行格式化,並啟動:

bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode

(3)在[nn2]上,同步nn1的元數據信息:

bin/hdfs namenode -bootstrapStandby

(4)啟動[nn2]:

sbin/hadoop-daemon.sh start namenode

(5)啟動所有DataNode

sbin/hadoop-daemons.sh start datanode

(6)將[nn1]切換為Active

bin/hdfs haadmin -transitionToActive nn1

啟動YARN
(1)在hadoop102中執行:

sbin/start-yarn.sh

(2)在hadoop103中執行:

sbin/yarn-daemon.sh start resourcemanager

(3)查看服務狀態

bin/yarn rmadmin -getServiceState rm1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM