VM Debian

Saya cuba menyediakan Hadoop dengan kluster nod tunggal (Single Node Cluster) di VM Debian. 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 (contoh):

/etc/hosts
192.168.122.x   debian.vm.loc debianvm
~/.ssh/config
# VM
Host debianvm
  HostName debian.vm.loc

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

bash
ssh debianvm

Pakej prasyarat

  • Pasang pakej pdsh. Pakej ini amat dicadang pemasangannya oleh Hadoop untuk mendapatkan pengurusan sumber SSH yang lebih baik.

  • Pemasangan Java: Muat turun Java SE 17 dan pasang pakej dengan arahan berikut:

    bash
    sudo dpkg -i jdk-17.x.x_linux-x64_bin.deb

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.5.0.tar.gz   # contoh
    tar -xvzf Downloads/hadoop-3.5.0.tar.gz
  • Edit fail .bashrc untuk menambah laluan:

    ~/.bashrc
    export JAVA_HOME="/usr/lib/jvm/jdk-17.x.x-oracle-x64"
    
    export HADOOP_HOME="$HOME/hadoop-3.5.0"
    export HADOOP_CONF_DIR="$HADOOP_HOME/etc/hadoop"
    export HADOOP_CLASSPATH="$HADOOP_HOME/share/hadoop/tools/lib/*:$HADOOP_CONF_DIR/*"
    
    export PATH="$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH"
  • Aktifkan perubahan.

    bash
    source ~/.bashrc

Konfigurasi Hadoop

hadoop-env.sh

$HADOOP_CONF_DIR/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jdk-17.x.x-oracle-x64

core-site.xml

$HADOOP_CONF_DIR/core-site.xml
<configuration>
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://debian.vm.loc:9000</value>
</property>
</configuration>

hdfs-site.xml

$HADOOP_CONF_DIR/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>debian.vm.loc:9870</value>
</property>
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>debian.vm.loc:9868</value>
</property>
<property>
  <name>dfs.datanode.data.dir</name>
  <value>datanodes</value>
</property>
<property>
  <name>dfs.datanode.http.address</name>
  <value>debian.vm.loc:9864</value>
</property>
</configuration>

yarn-site.xml

$HADOOP_CONF_DIR/yarn-site.xml
<configuration>
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>debian.vm.loc</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address</name>
  <value>debian.vm.loc: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>debian.vm.loc:8042</value>
</property>
</configuration>

mapred-site.xml

$HADOOP_CONF_DIR/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>debian.vm.loc: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>

workers

$HADOOP_CONF_DIR/workers
debian.vm.loc

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 [debian.vm.loc]
    Starting datanodes
    Starting secondary namenodes [debian.vm.loc]
    Starting resourcemanager
    Starting nodemanagers
    
  • Semak proses-proses yang berlangsung dan contoh output:

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

Praktis 1

(using a built-in example program called "grep")

  • Tambah direktori pengguna ke dalam Distributed filesystem:

    bash
    # Create the user directory. 
    hdfs dfs -mkdir -p /user/user
    
    # Create the directory for the test.  
    hdfs dfs -mkdir -p p1_intro/input
    
    # Copy files from the local fs to the distributed fs.
    hdfs dfs -put $HADOOP_CONF_DIR/*.xml p1_intro/input
    
    # Run a MapReduce job.
    hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar \
      grep p1_intro/input p1_intro/output 'dfs[a-z.]+'
  • Semak direktori:

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

    bash
    hdfs dfs -cat 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 p1_intro/output output1
  • Sambung dengan latihan seterusnya.

Praktis 2 (WordCount2)


  • Penyediaan:

    bash
    # Create the directories for Practice 2.
    hdfs dfs -mkdir -p 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 p2_wordcount2/input 
    hdfs dfs -moveFromLocal file2 p2_wordcount2/input 
    
    ### Confirm the moved files.
    hdfs dfs -ls -C p2_wordcount2/input
    p2_wordcount2/input/file1
    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 p2_wordcount2
    
    ### Display directories and files in p2_wordcount2.
    hdfs dfs -ls -C p2_wordcount2
    p2_wordcount2/input
    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 \
      p2_wordcount2/input p2_wordcount2/output1
    
    ### Check generated files and view output.
    hdfs dfs -cat 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 \
      p2_wordcount2/input p2_wordcount2/output2 \
      -skip p2_wordcount2/patterns.txt
    
    ### Observe the output.
    hdfs dfs -cat 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 \
      p2_wordcount2/input p2_wordcount2/output3 \
      -skip p2_wordcount2/patterns.txt
    
    ### Observe the output.
    hdfs dfs -cat p2_wordcount2/output3/part-r-00000
    bye	1
    goodbye	1
    hadoop	2
    hello	2
    world	2
    
  • Paparan web di:

  1. NameNode: http://<IP-atau-domain-VM>:9870

  2. ResourceManager: http://<IP-atau-domain-VM>:8088

  3. MapReduce JobHistory Server: http://<IP-atau-domain-VM>:19888

Setelah selesai, hentikan kesemua daemon:

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 (yang patutlah dipendam buat selama-lamanya): Menyanyi dan melukis.

Sumber dari Wallpaper Cave.