如何把 Spark run 在 local 端的 Hadoop + YARN 集群上 – 2

上一篇 我們成功在本 local 端的環境上用 docker 啟動 hadoop 集群然後也在上面成功執行 第一個 Spark application 文章中的 Spark 程式,接下來這一篇就可來看看一些 Hadoop 集群配置的細節啦!

Hadoop configuration 家族

我們的 Hadoop 版本是使用 3.4.1,參考完 Hadoop 官方有關如何配置集群的文件 Hadoop Cluster Setup 後,才發現並不是裡頭提到的所有配置都要設定才能成功啟動 Hadoop 集群,有些就讓它用預設值就好,以下是那些在 local 端啟動 Hadoop 集群的前提下,比較有關係的參數。

core-site.xml

hadoop 核心配置。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-master:9000</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
    </property>
</configuration>
  • fs.defaultFS:就是 namenode HDFS 協議的 url 位置啦,需注意這裡的 domain 名稱要等於 docker 容器啟動時的 hostname。
  • io.file.buffer.size:sequence 文件緩充區的大小,我拿 Hadoop Cluster Setup 的值來用。

hdfs-site.xml

hdfs 檔案系統相關配置。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/opt/hadoop/data/dfs/name</value>
    </property>
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>

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

    <!-- for data node property -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/opt/hadoop/data/dfs/data</value>
    </property>

</configuration>
  • dfs.namenode.name.dir:namenode 節點實際儲存 namespace 和 transaction 日誌的地方,簡單說就是 namenode 在節點上存資料的地方。
  • dfs.blocksize:每一個 HDFS 數據塊 的大小,基本的大小建議是 64 MB,但我們這裡就用預設的 128 MB。

HDFS 是設計來儲存大容量資料的,所以一個檔案會被拆成多個然後放到各台 data node 上面,所以讀取時可以同時往多台 data node 讀取數據塊回來,適合一次寫入,多次讀取的數據分析情景。

  • dfs.replication:每一個數據塊的備份數量,若檔案放到 Hadoop 時沒有特別指定的話,就會用這個值去備份。
  • dfs.datanode.data.dir:datanode 節點實際儲存資料的地方。

hadoop-env.sh

這邊就是用來配置 Hadoop 執行時會用到的環境變數,因為我們是用 docker 啟動 Hadoop 集群,為了方便起見就都用 root 這個身份來啟動服務,若你想用 root 身份啟動 Hadoop 的話,你需要設定下面這幾條環境變數才行。

### default setup
export LANG=en_US.UTF-8
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}


### manual setup
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

yarn-site.xml

YARN 就是一套區分資源管理 (Resource manager) 和任務排程、監控 (Node Manager) 的服務,通常 Resource manager 會在 namenode 節點上運行,然後每一個 datanode 節點會視為工作節點,每一台工作節點皆有 Node Manager 會負責啟動容器來運行 MapReduce Job 或 Spark application,同時也會監控容器資源使用狀況(cpu, memory, disk 和 network 等)並回報給 Resource Manager。

yarn_architecture

圖片來源:https://techvidvan.com/tutorials/hadoop-architecture/

而 yarn-site.xml 就是它們的配置。

<?xml version="1.0"?>

<configuration>

    <!--    Configurations for ResourceManager and NodeManager:-->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <!--    Configurations for ResourceManager:-->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>

    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>1024</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop-master</value>
    </property>

</configuration>
  • yarn.log-aggregation-enable:是否要開啟 log 聚合,預設為 false,這裡我們設為 true,有關 YARN log 聚合的說明可看此篇文章 YARN Log Aggregation (日志聚合) 不完全指南
  • yarn.scheduler.minimum-allocation-mb:每一個執行任務的容器最小設置記憶體,預設是 1024 MBs,因為是用 docker 的關係,所以我們改成 512 MBs。
  • yarn.scheduler.maximum-allocation-mb:每一個執行任務的容器最大設置記憶體,預設是 8192 MBs,因為是用 docker 的關係,所以我們改成 1024 MBs。
  • yarn.resourcemanager.hostname:Resource Manager 節點的 host name。

docker 相關

start-hadoop.sh

這裡自己寫了個 shell 來讓 docker container 啟動時執行 Hadoop process,

#!/bin/bash

if [ "$WORKLOAD" == "master" ];
then

  if [ ! -f "/opt/hadoop/data/dfs/name/current/VERSION" ]; then
    $HADOOP_HOME/bin/hdfs namenode -format
  fi

  $HADOOP_HOME/bin/hdfs --daemon start namenode
  $HADOOP_HOME/bin/yarn --daemon start resourcemanager


elif [ "$WORKLOAD" == "worker" ];
then

  $HADOOP_HOME/bin/hdfs --daemon start datanode
  $HADOOP_HOME/bin/yarn --daemon start nodemanager

else
    echo "Undefined Workload Type $WORKLOAD, must specify: master, worker"
fi

還有另一種啟動的方式為 $HADOOP_HOME/sbin/start-dfs.sh,用這方法的前提是你需要在每台節點都配置好可信任的 ssh,使其每台都能自由以 ssh 相互連線,可參考這個 Setup passphraseless ssh 文件設定,但因為我懶所以就用最簡單的方法來執行。

結語

在 local 端用 docke 啟動 Hadoop 集群不難,要設定的配置比想像中的少很多,畢竟 Hadoop 的配置真的是多到很噁心😩,希望這 2 篇文章能幫助到你們 😄

tshine73
tshine73
文章: 62

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *