CentOS 7上搭建Spark 3.0.1 + Hadoop 3.2.1分散式叢集

北風揚塵塵飛揚發表於2020-11-26

VMWare 安裝CentOS 7

  1. 推薦使用VMware Workstation Pro 16,下載安裝即可。
  2. 下載最新的CentOS 7 Minimal-2009.iso,在虛擬機器安裝。推薦1G運存和20G儲存。
  3. 在CentOS 7的安裝過程中,需要設定root使用者的密碼,還可以根據需要建立單獨的使用者。
  4. 安裝完成後,使用命令列進行更新,然後安裝net-tools.x86_64,以方便檢視ip地址。
    # 如果在安裝時沒有連線網路
     vi /etc/sysconfig/network-scripts/ifcfg-ens33
     # 將ONBOOT=no修改為yes
     # 重啟網路服務
     service network restart
     # 更新系統
     yum update
     # 安裝net-tools
     yum install net-tools.x86_64
     # 檢視ip地址
     ifconfig
    
    ip地址為:192.168.92.137

使用Xshell連線虛擬機器

  1. 這裡可以下載Xshell家庭/學校免費版,但是您需要申請才行。
  2. 檔案->新建會話,資訊配置可以參考如下,連線即可。
    名稱主機使用者名稱
    CentOS 7192.168.92.13722root
    表格中的資訊,具體需要更換成您自己的。

叢集設定

  1. 節點設定。
    hostname(主機名)ip地址namenode(主節點)datanode(從節點)
    master192.168.92.137TrueFalse
    slave1192.168.92.138FalseTrue
    slave2192.168.92.139FalseTrue
    slave3192.168.92.140FalseTrue
    為什麼上面的ip地址是連續的呢? 這其實跟DHCP有關,下一步我們會使用克隆主機的方式來建立多個slave機器,大家可以去驗證,但是可能出現與表中不一直的ip,我們根據需要修改即可。

安裝JDK 1.8

  1. 在進行下一步的克隆前,我們先安裝jdk-8u271-linux-x64.tar.gz,目前1.8版本的下載需要註冊Oracle的賬號才能夠下載,有點麻煩呢。
  2. 使用SCP命令上傳到master主機上,scp命令使用參考如下。
    scp local_file remote_username@remote_ip:remote_folder 
    
    引數依次是本地檔案,遠端使用者名稱和遠端ip,以及儲存的資料夾。在PowerShell中使用如下。
    	PS E:\XunLeiDownload> scp .\jdk-8u271-linux-x64.tar.gz root@192.168.92.137:/usr/local
    	>>> # 這是輸出
    	The authenticity of host '192.168.92.137 (192.168.92.137)' can't be established.
    	ECDSA key fingerprint is SHA256:DjkK5V/chVHAD1SsaosqdxfH4wClmH8S6M8kxw7X/RQ.
    	Are you sure you want to continue connecting (yes/no)?
    	Warning: Permanently added '192.168.92.137' (ECDSA) to the list of known hosts.
    	root@192.168.92.137's password:
    	jdk-8u271-linux-x64.tar.gz                                                            100%  137MB  91.5MB/s   00:01    # 上傳成功
    
  3. 解壓jdk1.8到/usr/local路徑下,
    	 tar -xvf jdk-8u271-linux-x64.tar.gz 
    	 mv jdk1.8.0_271 jdk1.8    # 重新命名資料夾
    
    安裝vim,編輯/etc/profile,
    	yum install vim # 安裝vim
    	vim /etc/profile
    
    新增兩行內容如下,
    	export JAVA_HOME=/usr/local/jdk1.8
    	export PATH=$PATH:$JAVA_HOME/bin
    
    執行source /etc/profile使環境生效,$JAVA_HOME檢視是否配置成功,或者,
    java -version   
    >>>   
    java version "1.8.0_271"
    Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
    Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
    
    表示配置成功。

SSH 免密登陸

  1. 在配置ssh免密登陸之前,將master克隆3份slaves出來,然後驗證其ip是否和上面所述一致,並使用Xshell連線,這樣我們可以得到額外的三臺機器,且都安裝好Java的。
    注意:在使用克隆時,不太推薦使用連結克隆。
    使用ifconfig檢視ip地址後,如下,下面將按照這個ip地址進行配置。
    hostname(主機名)ip地址namenode(主節點)datanode(從節點)
    master192.168.92.137TrueFalse
    slave1192.168.92.134FalseTrue
    slave2192.168.92.135FalseTrue
    slave3192.168.92.146FalseTrue
  2. 在master節點上更改hosts檔案如下。
    vim /etc/hosts編輯,在後面新增以下行。
    192.168.92.137 master
    192.168.92.134 slave1
    192.168.92.135 slave2
    192.168.92.136 slave3
    
    其他的slave節點也應該如此。
  3. 使用以下命令,分別更改4臺機器的主機名,以master節點為例。
    	hostnamectl set-hostname master
    
    其他節點是slave1-3,更改完成後在Xshell中重啟會話就可以發現主機名已經改變啦。
  4. 要使master和3臺slave免密登陸,需先在本地機器使用ssh-keygen一個公私鑰對。
    ssh-keygen -t rsa    # 生成公私鑰對
    >>>
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase):   # 不用輸入 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.    # 存放位置
    Your public key has been saved in /root/.ssh/id_rsa.pub.      # 公鑰
    The key fingerprint is:
    SHA256:vGAdZV8QBkGYgbyAj4OkQ9GrYEEiilX5QLmL97CcFeg root@master
    The key's randomart image is:
    +---[RSA 2048]----+
    |+o++o+ ..=*o+o.  |
    |==..= o oo o .   |
    |*..o.* ..   .    |
    |=.o.+ +o .       |
    |o..+ .o.S        |
    | .. E... .       |
    |   o *  .        |
    |    + .          |
    |                 |
    +----[SHA256]-----+
    
    其他三臺機器也是這樣生成。
  5. 將slaves生成的所有id_rsa.pub公鑰檔案通過scp上傳到master的/root/.ssh/目錄下。
    	scp id_rsa.pub root@master:/root/.ssh/id_rsa.pub.1    # slave2 對應於.2
    	scp id_rsa.pub root@master:/root/.ssh/id_rsa.pub.2    # 依此類推
    	# master上也要這樣處理,否則就不能從slaves登陸到master,如下
    	scp id_rsa.pub root@master:/root/.ssh/
    
    在master節點上,將所有的公鑰檔案寫入authorized_keys檔案中。
    cat id_rsa.pub* >> authorized_keys
    rm -rf id_rsa.pub.*     # 刪除
    
    分發authorized_keys檔案給slaves機器。
    scp authorized_keys root@slave1:/root/.ssh/
    scp authorized_keys root@slave2:/root/.ssh/
    scp authorized_keys root@slave3:/root/.ssh/
    
    分發known_hosts檔案給slaves機器。
    scp known_hosts root@slave3:/root/.ssh/  # 其他同上
    
    這樣就可以實現免密登陸啦,檢視known_hosts檔案如下。
    	master,192.168.92.137 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG4pcNSq4jQmGY3JRlYoU/IssJ8gfjTZhCcqBmLlviFismkti27xJHbd0s1rcaO/MX4ORK6eUdGr2ALE/r36otk=
    	slave1,192.168.92.134 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG4pcNSq4jQmGY3JRlYoU/IssJ8gfjTZhCcqBmLlviFismkti27xJHbd0s1rcaO/MX4ORK6eUdGr2ALE/r36otk=
    	slave2,192.168.92.135 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG4pcNSq4jQmGY3JRlYoU/IssJ8gfjTZhCcqBmLlviFismkti27xJHbd0s1rcaO/MX4ORK6eUdGr2ALE/r36otk=
    	slave3,192.168.92.136 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG4pcNSq4jQmGY3JRlYoU/IssJ8gfjTZhCcqBmLlviFismkti27xJHbd0s1rcaO/MX4ORK6eUdGr2ALE/r36otk=
    
    符合這樣的格式才可以呢。

安裝hadoop 3.2

  1. 下載hadoop-3.2.1.tar.gz,通過scp上傳之master節點,然後解壓。
    PS E:\XunLeiDownload> scp .\jdk-8u271-linux-x64.tar.gz root@192.168.92.137:/usr/local
     tar -xvf hadoop-3.2.1.tar.gz   # 解壓在/usr/local/hadoop-3.2.1
    
  2. 新增環境變數,vim /etc/profile,在最後新增以下兩行。
    export HADOOP_HOME=/usr/local/hadoop-3.2.1
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME:/sbin
    
    執行以下命令source /etc/profile,使配置檔案生效,並檢視是否成功。
    hadoop version
    >>>
    Hadoop 3.2.1
    Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r b3cbbb467e22ea829b3808f4b7b01d07e0bf3842
    Compiled by rohithsharmaks on 2019-09-10T15:56Z
    Compiled with protoc 2.5.0
    From source with checksum 776eaf9eee9c0ffc370bcbc1888737
    This command was run using /usr/local/hadoop-3.2.1/share/hadoop/common/hadoop-common-3.2.1.jar
    
  3. 在hadoop安裝目錄下建立以下目錄:
    mkdir tmp  # 即hadoop-3.2.1/tmp, 儲存臨時檔案
    mkdir -p hdfs/name  # namenode的資料目錄
    mkdir -p hdfs/data # datanode的資料目錄
    
  4. 配置相關配置檔案,在etc/hadoop目錄下。
    檔案介紹
    core-site.xml核心配置檔案
    dfs-site.xmlhdfs儲存相關配置
    apred-site.xmlMapReduce相關的配置
    arn-site.xmlyarn相關的一些配置
    workers用來指定從節點,檔案中預設是localhost
    hadoop-env.sh配置hadoop相關變數
    在core-site.xml檔案中指定預設檔案系統和臨時檔案目錄。
    <configuration>
         <property>
             <name>fs.defaultFS</name>
             <value>hdfs://master:9000</value>
         </property>
         <property>
             <name>hadoop.tmp.dir</name>
             <value>/usr/local/hadoop-3.2.1/tmp</value>
         </property>
     </configuration>
    
    在hdfs-site.xml中配置複製份數,datanode和namenode的目錄。
    <configuration>
       <property>
           <name>dfs.namenode.secondary.http-address</name>
           <value>master:50090</value>
       </property>
       <property>
           <name>dfs.replication</name>
           <value>3</value>
       </property>
       <property>
           <name>dfs.namenode.name.dir</name>
           <value>file:/usr/local/hadoop-3.2.1/hdfs/name</value>
           <final>true</final>
       </property>
       <property>
           <name>dfs.datanode.data.dir</name>
           <value>file:/usr/local/hadoop-3.2.1/hdfs/data</value>
           <final>true</final>
       </property>
       <property>
           <name>dfs.webhdfs.enabled</name>
           <value>true</value>
       </property>
       <property>
           <name>dfs.permissions.enabled</name>
           <value>false</value>
       </property>
    </configuration>
    
    在mapred-site.xml中指定主節點和新增classpath。
    <configuration>
       <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
       </property>
       <property>
           <name>mapreduce.jobhistory.address</name>
           <value>master:10020</value>
       </property>
       <property>
           <name>mapreduce.jobhistory.webapp.address</name>
           <value>master:19888</value>
       </property>
       <property>
           <name>mapreduce.application.classpath</name>
           <value>
               /usr/local/hadoop-3.2.1/etc/hadoop,
               /usr/local/hadoop-3.2.1/share/hadoop/common/*,
               /usr/local/hadoop-3.2.1/share/hadoop/common/lib/*,
               /usr/local/hadoop-3.2.1/share/hadoop/hdfs/*,
               /usr/local/hadoop-3.2.1/share/hadoop/hdfs/lib/*,
               /usr/local/hadoop-3.2.1/share/hadoop/mapreduce/*,
               /usr/local/hadoop-3.2.1/share/hadoop/mapreduce/lib/*,
               /usr/local/hadoop-3.2.1/share/hadoop/yarn/*,
               /usr/local/hadoop-3.2.1/share/hadoop/yarn/lib/*
           </value>
       </property>
    </configuration>
    
    yarn-site.xml中都需要指向主節點。
    <configuration>
       <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
       </property>
       <property>
           <name>yarn.resourcemanager.address</name>
           <value>master:8032</value>
       </property>
       <property>
           <name>yarn.resourcemanager.scheduler.address</name>
           <value>master:8030</value>
       </property>
       <property>
           <name>yarn.log-aggregation-enable</name>
           <value>true</value>
       </property>
       <property>
           <name>yarn.resourcemanager.resource-tracker.address</name>
           <value>master:8031</value>
       </property>
       <property>
           <name>yarn.resourcemanager.admin.address</name>
           <value>master:8033</value>
       </property>
       <property>
           <name>yarn.resourcemanager.webapp.address</name>
           <value>master:8088</value>
       </property>
    </configuration>
    
    workers中指定datanode節點。
    localhost
    slave1
    slave2
    slave3
    
    在hadoop-env.sh中指定使用者。
    export HADOOP_HOME=/usr/local/jdk1.8
    export HDFS_NAMENODE_USER=root
    export HDFS_DATANODE_USER=root
    export HDFS_SECONDARYNAMENODE_USER=root
    export YARN_RESOURCEMANAGER_USER=root
    export YARN_NODEMANAGER_USER=root
    
  5. 將配置好的hadoop分發到其他機器,在其他slaves機器上也要執行步驟2新增環境變數哦。
     scp -r hadoop-3.2.1 slave1:/usr/local/
     scp -r hadoop-3.2.1 slave2:/usr/local/
     scp -r hadoop-3.2.1 slave3:/usr/local/
    
  6. 格式化namenode,在master執行。
    hdfs name -format
    >> 
    2020-11-25 23:58:07,593 INFO common.Storage: Storage directory /usr/local/hadoop-3.2.1/hdfs/name has been successfully formatted.
    2020-11-25 23:58:07,640 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop-3.2.1/hdfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
    2020-11-25 23:58:07,792 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop-3.2.1/hdfs/name/current/fsimage.ckpt_0000000000000000000 of size 396 bytes saved in 0 seconds .
    2020-11-25 23:58:07,807 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
    2020-11-25 23:58:07,825 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown.
    2020-11-25 23:58:07,826 INFO namenode.NameNode: SHUTDOWN_MSG: 
    /************************************************************
    SHUTDOWN_MSG: Shutting down NameNode at master/192.168.92.137
    ************************************************************/
    
    在輸出中看到Storage: Storage directory /usr/local/hadoop-3.2.1/hdfs/name has been successfully formatted.,說明格式話成功了,在下一次格式化前,需要刪除hdfs和tmp目錄下的所有檔案,否則會執行不起來。
  7. 啟動hadoop,在sbin下。
    ./start-all.sh
    >>>
     ./start-all.sh
    Starting namenodes on [master]
    上一次登入:四 11月 26 00:08:30 CST 2020pts/5 上
    master: namenode is running as process 14328.  Stop it first.
    Starting datanodes
    上一次登入:四 11月 26 00:14:03 CST 2020pts/5 上
    slave1: WARNING: /usr/local/hadoop-3.2.1/logs does not exist. Creating.
    slave3: WARNING: /usr/local/hadoop-3.2.1/logs does not exist. Creating.
    slave2: WARNING: /usr/local/hadoop-3.2.1/logs does not exist. Creating.
    localhost: datanode is running as process 14468.  Stop it first.
    Starting secondary namenodes [master]
    上一次登入:四 11月 26 00:14:04 CST 2020pts/5 上
    Starting resourcemanager
    上一次登入:四 11月 26 00:14:09 CST 2020pts/5 上
    resourcemanager is running as process 13272.  Stop it first.
    Starting nodemanagers
    上一次登入:四 11月 26 00:14:19 CST 2020pts/5 上
    
    使用jps檢視。
    jps
    >>>
    15586 Jps
    14468 DataNode
    14087 GetConf
    13272 ResourceManager
    14328 NameNode
    15096 SecondaryNameNode
    15449 NodeManager
    
    這上面顯示的master節點的資訊slaves節點則少了一些,可以自行檢視哦。
  8. 驗證,訪問namenod主節點埠9870。
    service firewalld stop  # 需要關閉防火牆哦
    
    webui地址在:http://192.168.92.137:9870/
    namenode在下面的摘要如下,可以看到確實有4個節點。
    在這裡插入圖片描述檢視yarn管理介面,在http://192.168.92.137:8088/cluster
    yarn
  9. 測試,向hdfs檔案系統中寫入一個檔案。
    PS E:\XunLeiDownload> scp .\TwitterSecurity.csv root@192.168.92.137:/root
    # 這裡上傳一個40多兆的csv檔案
    hdfs dfs -put TwitterSecurity.csv /
    
    put data可以看到確實在是三個節點上覆制儲存。

安裝Spark 3.0.1

  1. 下載預編譯hadoop3.2的版本,spark-3.0.1-bin-hadoop3.2.tgz

  2. 使用scp上傳到master節點上,然後解壓,並加入相應的環境變數。

    PS E:\XunLeiDownload> scp .\spark-3.0.1-bin-hadoop3.2.tgz root@192.168.92.137:/usr/local     # 上傳
     tar -xvf spark-3.0.1-bin-hadoop3.2.tgz  # 解壓
      mv spark-3.0.1-bin-hadoop3.2 spark-3.0.1
    

    vim /etc/profile新增以下兩行。

    export SPARK_HOME=/usr/local/spark-3.0.1
    export PATH=$PATH:$SPARK_HOME:/bin:$SPARK_HOME:/sbin
    

    source /etc/profile使配置檔案生效。

  3. 進入conf資料夾,複製配置檔案模板。
    cp spark-env.sh.template spark-env.sh
    在spark-env.sh後面新增以下行。

     export JAVA_HOME=/usr/local/jdk1.8
    export HADOOP_CONF_DIR=/usr/local/hadoop-3.2.1/etc/hadoop
    export SPARK_MASTER_HOST=master
    export SPARK_LOCAL_DIRS=/usr/local/spark-3.0.1
    

    cp slaves.template slaves編輯如下。

    localhost
    slave1
    slave2
    slave3
    
  4. 將spark分發給slaves機器,同時不要忘記環境變數。

    scp -r spark-3.0.1 slave1:/usr/local/
    scp -r spark-3.0.1 slave2:/usr/local/
    scp -r spark-3.0.1 slave3:/usr/local/
    
  5. 執行,進入sbin目錄。

     ./start-all.sh 
     >>>
    org.apache.spark.deploy.master.Master running as process 16859.  Stop it first.
    slave1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-3.0.1/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave1.out
    slave3: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-3.0.1/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave3.out
    localhost: org.apache.spark.deploy.worker.Worker running as process 17975.  Stop it first.
    slave2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-3.0.1/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave2.out
    
  6. 檢視,地址在:http://192.168.92.137:8080/
    spark

總結

  1. 這不是個好玩意兒,配置起來真的很折騰人QAQ
  2. 喜歡的麻煩收藏一波呀hhh

相關文章