[大數據]-hadoop2.8和spark2.1完全分布式搭建


一、前期准備工作:

1.安裝包的准備:

2.輔助工具安裝包:

  • Putty:一個十分簡潔的鏈接服務器的工具。因為虛擬機太卡了長期在上面操作的話會卡到爆。用Putty可以在主機用一個終端來操作虛擬機。
  • FlashFxp:用於在宿主機上傳和下載虛擬機的文件,當然VMware安裝了tools之后可以隨意拖拽很方便,但是還是考慮到卡爆的問題,虛擬機啟動后我們完全不管他,就當作服務器來用。

3.系統基本配置:(未說明則均在主機rzxmaster上操作)

   第一步:安裝VMware,創建虛擬機Master,安裝Vim,Mysql(mysql也可以暫且不裝,但是考慮到后面組件的擴展還是先安上)。

   第二步:克隆虛擬機(選擇完全克隆)rzxmater,分別命名為rzxslave1,rzxslave2(這里的命名可以自行修改)。然后啟動三個虛擬機。 

      • 分別修改hostsname主機名。(這里實例修改rzxmaster這台機器的主機名)。
      • 輸入: sudo vim /etc/hostname 回車進入hostname文件的編輯。
      • 在hostname文件輸入: rzxmaster 另外兩台機器同理修改保存退出即可。
      • 輸入: source /etc/hostname 使配置立即生效。關閉終端重新打開即可看到主機名已經改變了。

   第四步:靜態Ip設置:

      • 靜態IP設置:http://blog.csdn.net/lv18092081172/article/details/52081859這篇博文介紹的很詳細,但是其中有部分問題,不知道是16.0和14.0版本差異的問題還是教程本身的問題,一個是網絡重啟之后DNS配置丟失的問題。每次重啟之后會發現配置的DNS文件恢復成了127.0.0.1這個問題是由於interface,networkManager兩種網絡管理沖突造成的。解決方法就是在編輯鏈接的時候將DNS也一起編輯。這樣就不用再編輯DNS的配置文件。如下圖所示:
      
      其他步驟按博文所說就可以完成靜態IP的配置。

   第五步:hosts配置,特別強調主機名稱不要含有下划線"_",最好是純英文。 因為hadoopXML配置的時候部分value不能有下划線,會報錯。

    • 修改hosts:添加主機名和IP的對應,目的是為了使用主機名的時候能夠定位(通過IP)到不同的機器。
      • 輸入: sudo vim /etc/hosts
      • 把三台機器的IP和主機名對應填入hosts文件,實例如下所示。填寫完之后保存退出。
      • 192.168.8.137        rzxmaster
        192.168.8.136        rzxslave1
        192.168.8.138        rzxslave2
      • 輸入: source /etc/hosts 使配置立即生效。
      • 輸入: ping rzxslave1 可以查看輸出是否有對應的IP地址,這里先不考慮弄否ping通。實例如下:

       

  第六步:SSH免密碼登錄:

    • 1 sudo apt-get update //更新源
      2 sudo apt-get install openssh-server //安裝ssh服務器
      3 sudo ps -e |grep ssh //查看ssh服務是否啟動
      4 sudo service ssh start //開啟ssh服務
      5 ssh-keygen -t rsa //生成公鑰密鑰 一路enter就行了
      6 cat /home/cxin/.ssh/id_rsa.pub >>/home/cxin/.ssh/authorized_keys //將公鑰添加到用戶公鑰文件。

      ssh的配置比較簡單教程也很多。不外乎以上幾條命令。在三台機子上都進行了如下操作之后,要是rzxmaster免密碼登錄到rzxslave1,rzxslave2。需要把master的公鑰放到slave1,2的authorized_keys文件中,這里只需要拷貝然后打開rzxslave1,2的authorized_keys文件粘貼上即可。保存之后重啟虛擬機。重啟之后在rzxmaster,輸入 ssh rzxslave1  如果不需要密碼就能登陸到rzxslave1說明成功,同理實驗rzxslave2。rzxmaster可以登錄到所有slave節點則SSH設置完畢。

二、集群搭建

通過前面的准備工作我們已經獲取到了所有需要的安裝包,設置好了靜態IP,配好了ssh免密碼登錄,接下就是集群的安裝了。首先我所有的包都是安裝在當前用戶的根目錄下,也就是終端打開的目錄(一般是: /home/username username是當前的用戶名),這個目錄是當親前用戶的工作空間我把這個目錄的位置記作 basePath=/home/username .這個basePath可以根據自己的喜好安裝到別的目錄下。(basePath=="~"==/home/cxin,我這里的basePath=/home/cxin)

三台虛擬機分別如下:rzxmaster是主節點(datanode),rzxslave1,rzxslave2是分支節點(namenode)

  192.168.8.137        rzxmaster

       192.168.8.136        rzxslave1

  192.168.8.138        rzxslave2

了方便管理這里在主目錄建了三個文件夾:Java,spark,hadoop. mkdir Java spark hadoop 

現在將jdk,hadoop,scala,spark的安裝包分別傳到路徑basePath/Java,basePath/hadoop,basePah/spark下,(scala和spark的壓縮包都放在spark文件夾下)。

1.Jdk配置:

  • cxin@rzxmaster:~$ cd ~
    cxin@rzxmaster:~$ pwd
    /home/cxin
    cxin@rzxmaster:~$ cd Java/
    cxin@rzxmaster:~/Java$ tar -zxvf jdk-8u11-linux-x64.tar.gz
    cxin@rzxmaster:~/Java$ mv jdk-8u11-linux-x64 jdk1.8
    cxin@rzxmaster:~/Java$ ls
    jdk1.8
    cxin@rzxmaster:~/Java$ cd jdk1.8/
    cxin@rzxmaster:~/Java/jdk1.8$ ls
    bin        include         lib      README.html  THIRDPARTYLICENSEREADME-JAVAFX.txt
    COPYRIGHT  javafx-src.zip  LICENSE  release      THIRDPARTYLICENSEREADME.txt
    db         jre             man      src.zip
    cxin@rzxmaster:~/Java/jdk1.8$ pwd
    /home/cxin/Java/jdk1.8

    解壓並修改了名稱,pwd命令獲取到了JAVA_HOME路徑: /home/cxin/Java/jdk1.8 下面配置環境變量:

  • sudo vim /etc/profile 在文件末尾添加如下代碼:
  • #java
    export JAVA_HOME=/home/cxin/Java/jdk1.8
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
  • 保存退出之后:輸入 source /etc/profile 使配置立即生效。 

  • java -version 查看是否配置成功,結果如下圖,則成功,否則檢查配置是否存在問題。  
  • 至此jdk已經配置完成了。

2.Hadoop配置:

  • 解壓並修改名稱.(過程同jdk一樣)
  • 配置環境變量:sudo vim /etc/profile ,添加如下代碼:
  • #Hadoop
    export HADOOP_HOME=/home/cxin/hadoop
    export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export YARN_HOME=$HADOOP_HOME
    export HADOOP_ROOT_LOGGER=INFO,console
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
  • 保存退出,輸入 source /etc/profile
  • 修改hadoop的四個配置文件: cd hadoop/etc/hadoop 新版本的配置文件在etc/hadoop目錄下,配置分兩2個部分:Hadoop守護進程(Hadoop Daemons)的環境配置和守護進程的詳細配置。
    • hadoop-env.sh:hadoop守護進程[Hadoop守護進程指NameNode/DataNode 和JobTracker/TaskTrackerJobTracker/TaskTracker是較低版本的資源管理調度模式,已經被yarn所取代。]的運行環境配置,這里只設置JAVA_HOME。編輯hadoop-env.sh並添加如下代碼: export JAVA_HOME=/home/cxin/Java/jdk1.8 
    • core-site.xml:
    • <configuration>
              <!-- 指定hdfs的namenode為rzxmaster -->
              <property>
                <name>fs.defaultFS</name>
                <value>hdfs://rzxmaster:9000</value>
              </property>
              <!-- Size of read/write buffer used in SequenceFiles. -->
              <property>
                 <name>io.file.buffer.size</name>
                 <value>131072</value>
             </property>
              <!-- 指定hadoop臨時目錄,自行創建 -->
              <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/home/cxin/hadoop/tmp</value>
              </property>
      </configuration>
    • hdfs-site.xml:配置namenode和datanode存儲命名空間和log的路徑
    • <configuration>
          <!-- 備份數:默認為3-->
           <property>
              <name>dfs.replication</name>
               <value>2</value>
           </property>
          <!-- namenode-->
           <property>
               <name>dfs.namenode.name.dir</name>
               <value>file:/home/cxin/hadoop/dfs/name</value>
           </property>
          <!-- datanode-->
           <property>
               <name>dfs.datanode.data.dir</name>
               <value>file:/home/cxin/hadoop/dfs/data</value>
           </property>
          <!--權限控制:false:不做控制即開放給他用戶訪問 -->
           <property>
               <name>dfs.permissions</name>
               <value>false</value>
           </property>
       </configuration>
    • mapred-site.xml:配置MapReduce。
    • <configuration>
          <!-- mapreduce任務執行框架為yarn-->
          <property>
               <name>mapreduce.framework.name</name>
               <value>yarn</value>
          </property>
          <!-- mapreduce任務記錄訪問地址-->
          <property>
                <name>mapreduce.jobhistory.address</name>
                <value>rzxmaster:10020</value>
           </property>
          <property>                 
                 <name>mapreduce.jobhistory.webapp.address</name>
                  <value>rzxmaster:19888</value>
           </property>
      </configuration>

      其中還有很多具體應用需要的配置暫且不做配置。參數如下:

      mapreduce.map.memory.mb           1536                   Larger resource limit for maps.
      mapreduce.map.java.opts -Xmx1024M Larger heap-size for child jvms of maps.
      mapreduce.reduce.memory.mb 3072 Larger resource limit for reduces.
      mapreduce.reduce.java.opts -Xmx2560M Larger heap-size for child jvms of reduces.
      mapreduce.task.io.sort.mb 512 Higher memory-limit while sorting data for efficiency.
      mapreduce.task.io.sort.factor 100 More streams merged at once while sorting files.
      mapreduce.reduce.shuffle.parallelcopies  50 Higher number of parallel copies run by reduces to fetch outputs from very large number of maps.

 

    • yarn-site.xml:配置resourcesmanager和nodemanager
    • <configuration>
          <property>
              <description>The hostname of the RM.</description>
                <name>yarn.resourcemanager.address</name>
               <value>rzxmaster:8032</value>
           </property>
           <property>
                       <name>yarn.resourcemanager.scheduler.address</name>
                      <value>rzxmaster:8030</value>
           </property>
           <property>
                      <name>yarn.resourcemanager.resource-tracker.address</name>
                       <value>rzxmaster:8031</value>
           </property>
           <property>                 
         <name>yarn.resourcemanager.admin.address</name> <value>rzxmaster:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>rzxmaster:8088</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
         <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration>
    • slaves:配置集群的DataNode節點,這些節點是slaves,NameNode是Master。在conf/slaves文件中列出所有slave的主機名或者IP地址,一行一個。配置如下:
    • rzxslave1
      rzxslave2
  • 以上的操作把基本的配置工作都完成了。至此已經完成了hadoop和jdk的配置,將Java和hadoop文件夾發送到其他節點的主機上。(使用scp命令)
  • cxin@rzxmaster:~/hadoop/etc/hadoop$ cd ~
    cxin@rzxmaster:~$ ls
    Desktop    Downloads         hadoop  Music     Public  Templates  
    Documents  examples.desktop  Java    Pictures  spark   Videos     
    //將java目錄發送到rzxslave1主機的主目錄下
    cxin@rzxmaster:~$ scp -r Java cxin@rzxslave1:/home/cxin/
    //將hadoop目錄發送到rzxslave1主機的主目錄下
    cxin@rzxmaster:~$ scp -r hadoop cxin@rzxslave1:/home/cxin/
  • 同理將java,hadoop發送到rzxslave2目錄下。 
  • 最后一步在rzxslave1,rzxslave2環境變量中添加上rzxmaster中配置的java,hadoop的環境變量(可直接復制粘貼,因為三台機器的配置路徑是相同的)
  • 至此,hadoop集群就搭建完成了。

3.hadoop集群啟動:(pwd=/home/cxin/hadoop)

  • 格式化文件系統:/bin/hdfs namenode -format 
  • 啟動服務: sbin/satrt-all.sh 
  • 查看服務: jps 結果如下:則說明服務啟動成功。(具體是否啟動還要按啟動日志是否報錯,有時候未啟動成功守護進程也會存在)
    • master:rzxmaster
    • 16002 Jps
      7764 NameNode
      7992 SecondaryNameNode
      8152 ResourceManager
    • slave:rzxslave1,rzxslave2
    • 4529 NodeManager
      6968 Jps
      4383 DataNode
  • 頁面訪問:192.168.8.137:8088,如果啟動成功可以看到存活的節點如下:
  •  訪問50070端口:192.168.8.137:50070
  •  

4.Spark配置:

spark是依賴與scala和java,hadoop的,前面配置好了java,hadoop,這里需要配置scala和spark的環境以及spark的詳細信息。

  • scala和spark的環境變量配置:(前面已經將scala和spark的安裝包放到了spark文件夾下)
    • 解壓縮並重命名(參考jdk的配置),結果如下:
    • 配置環境變量 vim /etc/profile ,添加如下代碼
    • #scala
      export SCALA_HOME=/home/cxin/spark/scala2.11.8
      export PATH=$SCALA_HOME/bin:$PATH
      #spark
      export SPARK_HOME=/home/cxin/spark/spark2.1
    • 保存退出,輸入 scala 如下圖則證明sala配置成功  
  • spark的詳細配置:修改spark的配置文件(spark根目錄的conf目錄下: pwd=/home/cxin/spark/spark2.1/conf )
    • spark-env.sh:spark執行任務的環境配置,需要根據自己的機器配置來設置,內存和核心數配置的時候主要不要超出虛擬機的配置,尤其是存在默認值的配置需要仔細查看,修改。
    • export SPARK_DIST_CLASSPATH=$(/home/cxin/hadoop/bin/hadoop classpath)
      #rzx----config
      SPARK_LOCAL_DIRS=/home/cxin/spark/spark2.1/local #配置spark的local目錄
      SPARK_MASTER_IP=rzxmaster #master節點ip或hostname
      SPARK_MASTER_WEBUI_PORT=8085 #web頁面端口
      
      #export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=4" #spark-shell啟動使用核數
      SPARK_WORKER_CORES=1 #Worker的cpu核數
      SPARK_WORKER_MEMORY=512m #worker內存大小
      SPARK_WORKER_DIR=/home/cxin/spark/spark2.1/worker #worker目錄
      SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.appDataTtl=604800" #worker自動清理及清理時間間隔
      SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://rzxmaster:9000/spark/history" #history server頁面端口>、備份數、log日志在HDFS的位置
      SPARK_LOG_DIR=/home/cxin/spark/spark2.1/logs #配置Spark的log日志
      JAVA_HOME=/home/cxin/Java/jdk1.8 #配置java路徑
      SCALA_HOME=/home/cxin/spark/scala2.11.8 #配置scala路徑
      HADOOP_HOME=/home/cxin/hadoop/lib/native #配置hadoop的lib路徑
      HADOOP_CONF_DIR=/home/cxin/hadoop/etc/hadoop/ #配置hadoop的配置路徑
    • spark-default.conf:
    • spark.master                     spark://rzxmaster:7077
      spark.eventLog.enabled           true
      spark.eventLog.dir               hdfs://rzxmaster:9000/spark/history
      spark.serializer                 org.apache.spark.serializer.KryoSerializer
      spark.driver.memory              1g
      spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
    • slaves:配置worker節點
    • rzxmaster
      rzxslave1
      rzxslave2
  • 至此spark已經配置完成了,將spark文件夾(包含scala和spark)發送到其他節點:
    • scp -r spark cxin@rzxslave1:/home/cxin
    • scp -r spark cxin@rzxslave2:/home/cxin
  • 在slave節點配置scala,spark的環境變量,最終三台主機的環境變量配置如下:
  • #java
    export JAVA_HOME=/home/cxin/Java/jdk1.8
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    #Hadoop
    export HADOOP_HOME=/home/cxin/hadoop
    export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export YARN_HOME=$HADOOP_HOME
    export HADOOP_ROOT_LOGGER=INFO,console
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
    #scala
    export SCALA_HOME=/home/cxin/spark/scala2.11.8
    export PATH=$SCALA_HOME/bin:$PATH
    #spark
    export SPARK_HOME=/home/cxin/spark/spark2.1
    export PATH=$SPARK_HOME/bin:$PATH
  • 啟動spark服務: sbin/start-all.sh 
  • 查看服務(rzxmaster): jps 由於在配置文件slaves中添加了rzxmaster,所以在此處有一個Worker進程。
  • 查看服務(rzxslave1,rzxslave2): jps 

  • 頁面查看:訪問192.168.8.137:8085(8085端口是設置在spark-env.sh中的SPARK_MASTER_WEBUI_PORT,可自行設置),結果如下:則說明成功了.
  • spark示例運行: ./bin/run-example SparkPi 2>&1 | grep "Pi is roughly" 計算圓周率。如下圖所示

  • 在8085端口可以看到運行的任務:
  • 至此說明spark配置成功,當然其他的內容需要在使用的時候去排除bug,如果出現問題需要查看日志信息找到問題出現的原因,然后修改配置。

5.配置總結:

在配置的過程中出現了很多的問題,包括:namenode,datanode啟動失敗,偽成功(存在守護線程但是實際服務為啟動),spak-shell啟動失敗爆出資源無法分配。由於在配置的時候沒有做好問題的記錄,所以這里列不出具體的異常信息。這里一部分異常是由於IP的設置和hosts中的配置不對應,一部分是ssh連接失敗,資源配置沒有根據虛擬機的配置做匹配。建議不要多次格式化namenode,每次格式化都會生成一個clusterID,多個clusterID導致啟動報錯,如需格式化就必須清除dfs/name,dfs/data下的文件。

hadoop,spark只是基礎組建,提供文件系統和數據運算,hadoop生態還包括hive,habse,kafka...等數據存儲和分析的組件,后面可以在此基礎上一步步安裝。

 


免責聲明!

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



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