VM Fedora

Saya cuba menyediakan Hadoop dengan kluster nod tunggal (Single Node Cluster) di VM Fedora. Pada hemat saya, mungkin tak akan mampu lagilah untuk saya usahakan penyediaan pengoperasian berdistribusi penuh bersama Kerberos sebagai kaedah pengesahan kerana Hadoop memerlukan sistem yang berprestasi tinggi.

Berdasarkan jawapan yang disediakan oleh platform-platform AI, saya ringkaskan syarat minimum sistem untuk mengehoskan Hadoop dengan kluster nod tunggal, memandangkan perkakasan komputer riba saya hanya mampu menampung sumber berskala kecil:

PerkakasanMinimumSarananVM saya
RAM4GB8GB6GB
CPU2 cores4 cores8 cores
Storan50GB100GB80GB

SSH setup (sistem Hos & VM)


Suka untuk saya gunakan resolusi hostname dengan mengikat alamat IP mesin saya (IPv4) kepada nama hos yang ditetapkan dengan menyunting fail /etc/hosts seperti berikut:

/etc/hosts
192.168.0.100   single.cluster.loc fedovm 
~/.ssh/config
## VMs
# with tuntap (kernel virtual network device)
Host fedovm 
  HostName single.cluster.loc
  User hadoop

Oh, ya! Saya set up pelayan Kerberos dan log masuk melalui sambungan SSH dengan kaedah GSSAPI di sini, sebagaimana yang saya muatkan dalam hantaran blog terdahulu bertajuk “Pemahaman Asas Kerberos dan SSH.” Hal ini bermaksud, VM ini bertindak sebagai pelayan dan klien Kerberos dalam masa yang sama.

Pastikan sudah memasang pakej openssh dan servis sshd sudah dimulakan sebelum meneruskan proses di bawah ini yang juga memberikan output selanjutnya:

bash
ssh -v fedovm 
...
Authenticated to single.cluster.loc ([192.168.0.100]:22) using "gssapi-keyex".
...

Pakej prasyarat


  • Pasang pakej pdsh. Pakej ini amat dicadang pemasangannya oleh Hadoop untuk mendapatkan pengurusan sumber SSH yang lebih baik. Saya pasang dari sumber dengan mengklon repositori GitHub-nya untuk mendapatkan konfigurasi bersama SSH yang tidak disediakan sebagai tetapan lalai oleh Fedora melalui repo rasminya.

  • Pasang pakej-pakej yang diperlukan untuk binaan dari sumber:

    bash
    sudo dnf install autoconf libtool
  • Klon dan bina:

    bash
    # inside $HOME
    mkdir Build && cd Build
    
    # Clone the repository.
    git clone https://github.com/chaos/pdsh.git
    
    # Get into the directory.
    cd pdsh
    
    # Run the following commands to compile and install. (Good Luck!)
    ./bootstrap
    ./configure --with-ssh
    sudo make
    sudo make install
    
    ### Confirm the installation by verifying its version.
    pdsh -V
    pdsh-2.35
    rcmd modules: ssh,rsh,exec (default: rsh)
    misc modules: (none)
    
  • Pemasangan Java:

    Muat turun Java SE Development Kit 8u441 (fail jdk-8u441-linux-x64.rpm) yang memerlukan pengguna untuk log masuk ke akaun Oracle dan pasang dengan perintah baris:

    bash
    sudo dnf install jdk-8u441-linux-x64.rpm

Pemasangan Hadoop


  • Muat turun pakej binari dari laman web rasmi Hadoop dan ekstrak pakej kompres itu ke direktori rumah pengguna dengan perintah tar:

    bash
    wget -P ~/Downloads https://dlcdn.apache.org/hadoop/common/current/hadoop-3.4.1.tar.gz   # contoh 
    tar -xvzf Downloads/hadoop-3.4.1.tar.gz
  • Edit fail .bashrc untuk menambah laluan:

    ~/.bashrc
    export JAVA_HOME="/usr/lib/jvm/jdk-1.8.0_441-oracle-x64"
    export HADOOP_HOME="$HOME/hadoop-3.4.1"
    export HADOOP_CLASSPATH="$JAVA_HOME/lib/tools.jar"
    export PATH="$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH"
  • Aktifkan perubahan.

    bash
    source ~/.bashrc

Pengurusan FireWall di VM


  • Memandangkan saya jalankan tugasan melalui SSH ke VM dari sistem hos, saya gunakan UFW sebagai pengurus FireWall untuk mendapatkan paparan web di hos.
    bash
    sudo dnf install ufw
    sudo systemctl enable --now ufw
    sudo ufw enable
    sudo ufw allow 8000:19999/tcp

Konfigurasi Hadoop


  • Sunting fail di bawah dan tambahkannya dengan :

    $HADOOP_HOME/etc/hadoop/hadoop-env.sh
    export JAVA_HOME="/usr/lib/jvm/jdk-1.8.0_441-oracle-x64"
    $HADOOP_HOME/etc/hadoop/core-site.xml
    <configuration>
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://fedovm:9000</value>
      </property>
    </configuration>
    $HADOOP_HOME/etc/hadoop/hdfs-site.xml
    <configuration>
      <property>
        <name>dfs.replication</name>
        <value>1</value>
      </property>
      <property>
        <name>dfs.namenode.name.dir</name>
        <value>namenodes</value>
      </property>
      <property>
        <name>dfs.namenode.http-address</name>
        <value>fedovm:9870</value>
      </property>
      <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>fedovm:9868</value>
      </property>
      <property>
        <name>dfs.datanode.data.dir</name>
        <value>datanodes</value>
      </property>
      <property>
        <name>dfs.datanode.http.address</name>
        <value>fedovm:9864</value>
      </property>
    </configuration>
    $HADOOP_HOME/etc/hadoop/mapred-site.xml
    <configuration>
      <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
      </property>
      <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>fedovm:19888</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.intermediate-done-dir</name>
        <value>mr-history/tmp</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.done-dir</name>
        <value>mr-history/done</value>
      </property>
    </configuration>
    $HADOOP_HOME/etc/hadoop/yarn-site.xml
    <configuration>
      <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>fedovm</value>
      </property>
      <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>fedovm:8088</value>
      </property>
      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
      <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
      </property>
      <property>
        <name>yarn.nodemanager.webapp.address</name>
        <value>fedovm:8042</value>
      </property>
    </configuration>
    $HADOOP_HOME/etc/hadoop/workers
    fedovm

Mulakan servis


  • Format NameNode:

    bash
    hdfs namenode -format
  • Mulakan daemon HDFS dan YARN (contoh output):

    bash
    start-dfs.sh && start-yarn.sh && mapred --daemon start historyserver 
    Starting namenodes on [fedovm]
    Starting datanodes
    Starting secondary namenodes [fedovm]
    Starting resourcemanager
    Starting nodemanagers
    
  • Semak proses-proses yang berlangsung dan contoh output:

    bash
    jps
    2289 NodeManager
    1970 SecondaryNameNode
    1749 DataNode
    2758 Jps
    1639 NameNode
    2190 ResourceManager
    2671 JobHistoryServer
    

Praktis 1 (using a built-in example program called “grep”)


  • Tambah direktori pengguna ke dalam Distributed filesystem:

    bash
    # Return to $HOME
    cd ~
    
    # Create the user directory. 
    hdfs dfs -mkdir -p /user/hadoop
    
    # It will display 'mr-history' dir.
    hdfs dfs -ls /user/hadoop
    
    # Create the directory for the test.  
    hdfs dfs -mkdir -p /user/hadoop/p1_intro/input
    
    # Copy files from the local fs to the distributed fs.
    hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /user/hadoop/p1_intro/input
    
    # Run a MapReduce job.
    hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.1.jar \
      grep /user/hadoop/p1_intro/input /user/hadoop/p1_intro/output \
      'dfs[a-z.]+'
  • Semak direktori:

    bash
    hdfs dfs -ls -C /user/hadoop/p1_intro
    hdfs dfs -ls -C /user/hadoop/p1_intro/output 
    /user/hadoop/p1_intro/output/_SUCCESS
    /user/hadoop/p1_intro/output/part-r-00000
    
  • Output:

    bash
    hdfs dfs -cat /user/hadoop/p1_intro/output/part-r-00000 
    1	dfsadmin
    1	dfs.replication
    1	dfs.namenode.secondary.http
    1	dfs.namenode.name.dir
    1	dfs.namenode.http
    1	dfs.datanode.http.address
    1	dfs.datanode.data.dir
    
  • Atau salin fail pengeluaran ke sistem lokal:

    bash
    # OR copy the outputs from the distributed fs to the local fs for observation.
    hdfs dfs -get /user/hadoop/p1_intro/output output1
  • Sambung dengan latihan seterusnya.

Praktis 2 (WordCount2)


  • Penyediaan:

    bash
    # Create the directories for Practice 2.
    hdfs dfs -mkdir -p /user/hadoop/p2_wordcount2/input
    
    # Create two files; file1 & file2.
    touch file1 file2  # residing in the local fs.
    echo 'Hello World, Bye World!' > file1
    echo 'Hello Hadoop, Goodbye to hadoop.' > file2
    
    # Move the files from the local fs to the distributed fs.
    hdfs dfs -moveFromLocal file1 /user/hadoop/p2_wordcount2/input 
    hdfs dfs -moveFromLocal file2 /user/hadoop/p2_wordcount2/input 
    
    ### Confirm the moved files.
    hdfs dfs -ls -C /user/hadoop/p2_wordcount2/input
    /user/hadoop/p2_wordcount2/input/file1
    /user/hadoop/p2_wordcount2/input/file2
    
  • Penyediaan awal untuk menggunakan ciri DistributedCache dalam dua kerja terakhir nanti:

    bash
    touch patterns.txt
    
    # Create patterns.txt with specified lines. 
    echo -e '\\.\n\\,\n\\!\nto' > patterns.txt
    
    ### Confirm the contents of patterns.txt.
    cat patterns.txt
    \.
    \,
    \!
    to
    
  • Pindahkan fail di atas dari sistem lokal ke sistem distribusi:

    bash
    hdfs dfs -moveFromLocal patterns.txt /user/hadoop/p2_wordcount2
    
    ### Display directories and files in p2_wordcount2.
    hdfs dfs -ls -C /user/hadoop/p2_wordcount2
    /user/hadoop/p2_wordcount2/input
    /user/hadoop/p2_wordcount2/patterns.txt
    
  • Salin kod Java, “Example: WordCount v2.0 Source Code” ini ke dalam fail WordCount2.java (available in Hadoop documentation as Tutorial). Atau simpan pautan “WordCount2.java” ini sebagai kod sumber Java.

  • Semak kod terlebih dahulu dengan perintah less:

    bash
    less WordCount2.java
  • Penyusunan:

    bash
    # Compile the WordCount2 Java source code.
    hadoop com.sun.tools.javac.Main WordCount2.java
    
    # Package the compiled Java classes into a JAR file.
    jar cf wc.jar WordCount*.class
    
    ### List compiled files and jars.
    ls ~/ | grep -E 'wc\.jar|WordCount2.*\.class'
    wc.jar
    WordCount2$IntSumReducer.class
    WordCount2$TokenizerMapper$CountersEnum.class
    WordCount2$TokenizerMapper.class
    WordCount2.class
    
  • Jalankan kerja MapReduce tanpa ciri DistributedCache:

    bash
    hadoop jar wc.jar WordCount2 \
      /user/hadoop/p2_wordcount2/input /user/hadoop/p2_wordcount2/output1
    
    ### Check generated files and view output.
    hdfs dfs -cat /user/hadoop/p2_wordcount2/output1/part-r-00000
    Bye	1
    Goodbye	1
    Hadoop,	1
    Hello	2
    World!	1
    World,	1
    hadoop.	1
    to	1
    
  • Perhatikan perubahan output untuk proses MapReduce di bawah:
    = dengan menetapkan sensitiviti bagi jenis huruf kepada benar;
    = dengan mengaktifkan ciri DistributedCache melalui opsyen -skip.

    bash
    hadoop jar wc.jar WordCount2 -Dwordcount.case.sensitive=true \
      /user/hadoop/p2_wordcount2/input /user/hadoop/p2_wordcount2/output2 \
      -skip /user/hadoop/p2_wordcount2/patterns.txt
    
    ### Observe the output.
    hdfs dfs -cat /user/hadoop/p2_wordcount2/output2/part-r-00000
    Bye	1
    Goodbye	1
    Hadoop	1
    Hello	2
    World	2
    hadoop	1
    
  • Begitu juga untuk proses MapReduce di bawah:
    = dengan menetapkan sensitiviti bagi jenis huruf kepada tidak benar;
    = dengan mengaktifkan ciri DistributedCache melalui opsyen -skip.

    bash
    hadoop jar wc.jar WordCount2 -Dwordcount.case.sensitive=false \
      /user/hadoop/p2_wordcount2/input /user/hadoop/p2_wordcount2/output3 \
      -skip /user/hadoop/p2_wordcount2/patterns.txt
    
    ### Observe the output.
    hdfs dfs -cat /user/hadoop/p2_wordcount2/output3/part-r-00000
    bye	1
    goodbye	1
    hadoop	2
    hello	2
    world	2
    
  • Paparan web di:

  1. NameNode: http://fedovm:9870/

  2. ResourceManager: http://fedovm:8088/

  3. MapReduce JobHistory Server: http://fedovm:19888/

  • Setelah selesai, hentikan daemon YARN dan HDFS:
    bash
    mapred --daemon stop historyserver && stop-yarn.sh && stop-dfs.sh
    exit

Tentang Blog & Penulis

Topik perbincangan dalam blog ini merangkumi Linux dan perisian sumber terbuka, Virtual Machine, serta Typesetting system.
Fokus semasa: Full Stack Development
Minat sampingan: Analisis Data
Bakat tersembunyi hamba: Menyanyi dan melukis.

Sumber dari Wallpaper Cave.