Hướng dẫn cài đặt Hadoop cluster trên Ubuntu 18.04

675

Bài viết này mình sẽ hướng dẫn các bạn cách cài đặt một cụm Hadoop (Hadoop cluster), và sau đó thực hiện một demo nho nhỏ để chúng ta hiểu rõ hơn về cách mà Hadoop hoạt động.

Cụ thể chúng ta sẽ cài đặt Hadoop 2.7.7 trên hệ điều hành Ubuntu 18.04.

Phiên bản mới nhất của Hadoop là 3.x, tuy nhiên một số thành phần trong hệ sinh thái của Hadoop lại chỉ làm việc tốt với Hadoop 2, nên mình sẽ cài Hadoop 2 để sau này có tích hợp thêm các thành phần khác thì không cần phải cài lại.

Quá trình cày đặt chia thành rất nhiều bước, bạn nên đọc từ từ, đừng scroll chuột quá nhanh.

I. Cụm Hadoop

Mình sẽ cài 1 name node và 1 data node. Mỗi node trên một máy khác nhau và có IP như sau:

  • Máy master (name node): 192.168.33.11
  • Máy slave-1 (data node): 192.168.33.12

Cả hai máy đều được cài sẵn hệ điều hành Ubuntu 18.04. Cấu hình Ram 4G, CPU 2 cores.

Bạn nên để cấu hình tối thiểu cấu hình như trên, nếu không khi chạy sẽ có bị bị những lỗi do thiếu bộ nhớ.

II. Chuẩn bị

Tất cả các thao tác ở đây nếu không chỉ rõ phải cài trên master hay slave thì có nghĩa là phải trên cả hai máy.

Các bước cài đặt dưới đây được mình thực hiện bằng cách cài master và slave đồng thời, chứ không phải cài xong master rồi mới cài slave.

2.1 Cài đặt trước mấy thứ linh tinh

Update lại các package để đảm bảo nó là mới nhất.

sudo apt update

Cài đặt java 8

sudo apt install openjdk-8-jdk

Cài đặt ssh

sudo apt-get install ssh
sudo apt install openssh-server

Cấu hình ssh

sudo vim /etc/ssh/sshd_config

Tìm đoạn # PubkeyAuthentication yes. Bỏ dấu # phía trước thành

...
PubkeyAuthentication yes
...

Tìm đoạn PasswordAuthentication no đổi thành

...
PasswordAuthentication yes
...

Khởi động lại ssh

sudo service sshd restart

2.2 Cấu hình host/hostname

Cấu hình host

sudo vim /etc/hosts

Bổ sung thêm 2 host master và slave như sau

192.168.33.11 master
192.168.33.12 slave-1

Cài đặt hostname cho master (thực hiện trên máy master)

sudo vim /etc/hostname

Trong file này sẽ xuất hiện hostname mặc định của máy, bạn xóa đi và đổi thành

master

Cài đặt hostname cho slave (thực hiện trên máy slave)

sudo vim /etc/hostname

Trong file này sẽ xuất hiện hostname mặc định của máy, bạn xóa đi và đổi thành

slave-1

2.3 Tạo user hadoop

Chúng ta sẽ tạo một user mới trên Ubuntu là hadoopuser để quản lý các permission cho đơn giản.

Phần này bạn cứ tạo cho hadoopuser một mật khẩu nhé, đừng để mật khẩu trống

sudo addgroup hadoopgroup
sudo adduser hadoopuser
sudo usermod -g hadoopgroup hadoopuser
sudo groupdel hadoopuser

Chuyển qua hadoopuser

sudo su - hadoopuser

2.4 Cài đặt hadoop

Mình sẽ cài đặt Hadoop 2.7.7

wget -c -O hadoop.tar.gz http://mirrors.viethosting.com/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz

Link dowload hadoop có thể sẽ bị thay đổi bởi chính tổ chức phát hành, nếu không download được bạn có thể tìm link ở đây. Trong trường hợp ở đó mà vẫn không tìm thấy link thì comment mình sẽ hỗ trợ.

Giải nén

tar -xvf hadoop.tar.gz

Đổi tên thư mục giải nén thành hadoop cho dễ quản lý

mv hadoop-2.7.7 hadoop

Cấu hình một số biến môi trường

vim ~/.bashrc

Thêm vào cuối file .bashrc nội dung như sau

export HADOOP_HOME=/home/hadoopuser/hadoop #Đường dẫn tiới hadoop home
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/ # Đường dẫn tới javahome
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_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

Source lại

source ~/.bashrc

Giờ chúng ta sẽ cấu hình một số thông tin cần thiết cho Hadoop

vim ~/hadoop/etc/hadoop/hadoop-env.sh

Tìm đoạn export JAVA_HOME=... sửa thành như sau:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

Cấu hình core-site.xml

vim ~/hadoop/etc/hadoop/core-site.xml

Cấu hình lại thông tin như sau

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoopuser/tmp</value>
        <description>Temporary Directory.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:54310</value>
        <description>Use HDFS as file storage engine</description>
    </property>
</configuration>

Cấu hình mapred-site.xml (chỉ cấu hình ở master)

cd ~/hadoop/etc/hadoop/
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml

Chỉnh sửa lại thông tin cấu hình như sau:

<configuration>
    <property>
        <name>mapreduce.jobtracker.address</name>
        <value>master:54311</value>
        <description>The host and port that the MapReduce job tracker runs
            at. If “local”, then jobs are run in-process as a single map
            and reduce task.
        </description>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <description>The framework for running mapreduce jobs</description>
    </property>
</configuration>

Cấu hình hdfs-site.xml

vim ~/hadoop/etc/hadoop/hdfs-site.xml

Chỉnh sửa lại thông tin cấu hình như sau

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <description>Default block replication.
            The actual number of replications can be specified when the file is
            created.
            The default is used if replication is not specified in create time.
        </description>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoopuser/hadoop/hadoop_data/hdfs/namenode</value>
        <description>Determines where on the local filesystem the DFS name
            node should store the name table(fsimage). If this is a comma-delimited
            list of directories then the name table is replicated in all of the
            directories, for redundancy.
        </description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoopuser/hadoop/hadoop_data/hdfs/datanode</value>
        <description>Determines where on the local filesystem an DFS data node
            should store its blocks. If this is a comma-delimited list of
            directories, then data will be stored in all named directories,
            typically on different devices. Directories that do not exist are
            ignored.
        </description>
    </property>
</configuration>

Cấu hình yarn-site.xml

vim ~/hadoop/etc/hadoop/yarn-site.xml

Chỉnh sửa lại thông tin cấu hình như sau

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</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>
</configuration>

Chỉ ra các máy slaves (chỉ cấu hình ở master)

vim ~/hadoop/etc/hadoop/slaves

Thêm hostname của các máy slave

# Mỗi máy salve đặt trên 1 dòng
slave-1

2.5 Cài đặt ssh key giữa các node

Tới đây, Hadoop đã có mặt trên hai máy masterslave. Giờ chúng ta sẽ cấu hình cho chúng có thể kết nối được với nhau.

Thao tác này chỉ thực hiện trên master.

# Đăng nhập với hadoopuser
sudo su - hadoopuser

# Tạo ssh key
ssh-keygen -t rsa -P ""
cat /home/hadoopuser/.ssh/id_rsa.pub >> /home/hadoopuser/.ssh/authorized_keys 
chmod 600 /home/hadoopuser/.ssh/authorized_keys

# Share ssh key giữa master - master
ssh-copy-id -i ~/.ssh/id_rsa.pub master

# Share ssh key giữa master - slave
ssh-copy-id -i ~/.ssh/id_rsa.pub slave-1

Test kết nối ssh

# Test kết nối tới master
ssh hadoopuser@master

# Đăng xuất
logout

# Test kết nối tới slave
ssh hadoopuser@slave-1

# Đăng xuất
logout

2.6 Format namenode

Thao tác này chỉ thực hiện trên master

Thao tác này giúp bạn cập nhật lại các thông tin cấu hình của master

hadoop namenode -format

2.7 Kiểm tra xem mọi thứ đã ổn

Trên master chúng ta chạy lệnh sau để khởi động các thành phần có trong Hadoop

start-all.sh

Kiểm tra các thành phần có chạy đủ bằng lệnh sau

jps

Nếu xuất hiện output dạng như sau thì có nghĩa là các thành phần đã chạy đủ

2003 NameNode
2412 ResourceManager
2669 Jps
2255 SecondaryNameNode

Kiểm tra các máy slave còn hoạt động hay không

hdfs dfsadmin -report

Nếu thấy xuất hiện output như sau thì có nghĩa là máy slave vẫn đang hoạt động

20/02/18 12:28:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
Configured Capacity: 10340794368 (9.63 GB)
Present Capacity: 8154087424 (7.59 GB)
DFS Remaining: 8154054656 (7.59 GB)
DFS Used: 32768 (32 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
 
Live datanodes (1): # Số datanode (slave node) đang hoạt động
Name: 192.168.33.12:50010 (slave)
Hostname: ubuntu-bionic
Decommission Status : Normal
Configured Capacity: 10340794368 (9.63 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 2169929728 (2.02 GB)
DFS Remaining: 8154054656 (7.59 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.85%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Tue Feb 18 12:28:56 UTC 2020

Bạn cũng có thể truy cập vào 2 url sau trên trình duyệt

  • http://192.168.33.11:50070: Xem thông tin tổng quan về DFS
  • http://192.168.33.11: 8088: Xem thông tin chung của cả cụm Hadoop

3. Chạy thử

Trước tiên hãy khởi động mọi thứ trước, nếu bạn đã chạy ở mục 2.7 rồi thì thôi nhé.

start-all.sh

Tạo test

# Ra thư mục gốc
cd ~

# Tạo file test
vim test.sh

Tạo nội dung như sau

#!/bin/bash
# test the hadoop cluster by running wordcount

# create input files
mkdir input
echo "Hello World" >input/file2.txt
echo "Hello Hadoop" >input/file1.txt

# create input directory on HDFS
hadoop fs -mkdir -p input
# put input files to HDFS
hdfs dfs -put ./input/* input

# run wordcount
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.7.7-sources.jar org.apache.hadoop.examples.WordCount input output

# print the input files
echo -e "\ninput file1.txt:"
hdfs dfs -cat input/file1.txt
echo -e "\ninput file2.txt:"
hdfs dfs -cat input/file2.txt

# print the output of wordcount
echo -e "\nwordcount output:"
hdfs dfs -cat output/part-r-00000

Giải thích: Test trên sẽ tạo ra 2 file file2.txtfile1.txt có nội dung lần lượt là Hello WorldHello Hadoop. 2 file này lần lượt được đưa vào trong HDFS, sau đó sẽ chạy một job có nhiệm vụ đếm số lần xuất của hiện của mỗi từ có trong file1.txtfile2.txt.

Chạy test

./test.sh

Chạy xong mà bạn nhận được kết quả dạng như

...
World    1
Hadoop   1
Hello    2

Thì có nghĩa là mọi thứ đã ok

Trong trường hợp bạn muốn test lại thì phải xóa kết quả cũ bằng lệnh sau

rm -rf input
hadoop fs -rm -r input
hadoop fs -rm -r output

Rồi chạy lại ./test.sh

4. Tổng kết

Mục tiêu của bài này là cài được một cụm Hadoop và đảm bảo nó chạy ổn, tạm thời bạn chưa cần phải hiểu quá rõ về các thông tin cấu hình hay cách hoạt động của job. Chúng ta sẽ tìm hiểu kỹ hơn ở các bài sau.