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.
Mục lục
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 master và slave. 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ề DFShttp://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.txt và file1.txt có nội dung lần lượt là Hello World và Hello 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.txt
và file2.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.
- Giới thiệu series tìm hiểu Big data cơ bản
- Big data là gì
- Giới thiệu về Apache Hadoop
- Tìm hiểu về hệ thống phân tán
- Hướng dẫn cài đặt Hadoop cluster trên Ubuntu18.04
- Tìm hiểu về HDFS
- Kiến trúc HDFS
- Một số command line tương tác với HDFS
- Tương tác với HDFS thông qua restful api với WebHDFS
- … Còn nữa… mình đang viết