Xử lý bigdata bằng dịch vụ EMR của AWS part 1 (cài đặt hệ thống spark bằng tay)

Chào các bạn, như ở phần trước mình đã nói sơ qua về spark và cách setup spark tự động trên EC2 rất đơn giản và dễ dàng. Tuy nhiên nếu bạn muốn setup 1 hệ thống để test thử hay bạn đã có sẵn 1 hệ thống máy chủ và muốn tự mình cài đặt và trai nghiệm spark, thì đây sẽ là bài viết bạn cần đọc rồi đó 😉

OK, để bắt đầu cài đặt hệ thống bạn cần chọn một OS để cài đặt sử dụng. Để đồng nhất với EC2 ở đây chúng ta sẽ sử dụng CentOs. Và để cài đặt Spark chúng ta cần 4 bước sau

Đầu tiên chúng ta cần cài java cho os, minh cài bản mới nhất bây giờ đó là bản 8. Lý do mà chúng ta cần đến java đó là bởi vì spark hoạt động bằng cách phân chia dữ liệu trên nhiều máy trạm dựa trên hệ thống máy ảo java(nếu bạn nào muốn tối ưu hệ thống một cách tối đa thì nên tìm hiểu thêm về hệ thống máy ảo java, các phân chia vùng nhớ để có config tối ưu nhất cho yêu cầu sử dụng hệ thống của bạn). Nhưng cũng đừng lo lắng qua vì nếu sử dụng cho yêu cầu cơ bản thì mình nghĩ cấu hình cơ bản mà mình sắp nói sau đây cũng đủ để bạn dùng rồi 😃.

Thôi lan man quá rồi, bắt tay vào cài đặt hệ thống thôi nào

Bước 1 cài đặt java (8)

Đầu tiên chúng ta cần download bản setup về máy

Cho bản 64bit

# cd /opt/
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz"

# tar xzf jdk-8u111-linux-x64.tar.gz

Cho bản 32 bit

# cd /opt/
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-i586.tar.gz"

# tar xzf jdk-8u111-linux-i586.tar.gz

Nếu download lỗi, bạn có thể vào trang chủ của oracle để tải bản jdk mới nhất về

Ok sau khi download xong bạn cần cài đặt thông qua các câu lệnh sau

# cd /opt/jdk1.8.0_111/
# alternatives --install /usr/bin/java java /opt/jdk1.8.0_111/bin/java 2
# alternatives --config java

Lúc này bảng thông báo sẽ hiện lên các version java có trong máy bạn, bạn cần chọn con số ứng với phiên bản mà bạn muốn sử dụng mà ở đây là số 4 ứng với phiên bản mới nhất


  Selection    Command
-----------------------------------------------
*  1           /opt/jdk1.7.0_71/bin/java
 + 2           /opt/jdk1.8.0_45/bin/java
   3           /opt/jdk1.8.0_91/bin/java
   4           /opt/jdk1.8.0_111/bin/java

Ok như vậy ta đã cài đặt xong tuy nhiên chúng ta cần cài đật thêm jax và đường dẫn để sử dụng java như sau

# alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_111/bin/jar 2
# alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_111/bin/javac 2
# alternatives --set jar /opt/jdk1.8.0_111/bin/jar
# alternatives --set javac /opt/jdk1.8.0_111/bin/javac
# export JAVA_HOME=/opt/jdk1.8.0_111
# export PATH=$PATH:/opt/jdk1.8.0_111/bin:/opt/jdk1.8.0_111/jre/bin

Tiếp để chắc chắn chúng ta cần kiểm tra lại xem quá trình cài đặt đã xong và phiên bản sử dụng đã đúng chưa, thông qua câu lệnh

# java -version

java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

Bước 2 cài đặt Hadoop và Yarn

Trước khi vào bước này chúng ta cần cài đặt địa chỉ ip tĩnh cho máy bạn sử dụng để sau này các máy có thể tiếp tục giao tiếp với nhau dù khi bị reboot hay mất kết nối mạng thì địa chỉ của máy sẽ vẫn được giữ nguyên.

Đầu tiên bạn cần sửa file /etc/sysconfig/network-scripts/ifcfg-eth0

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
NM_CONTROLLED="yes"
ONBOOT=yes # cái này để lúc khỏi động lại máy, cấu hình này sẽ tự load lại
HWADDR=A4:BA:DB:37:F1:04
TYPE=Ethernet
BOOTPROTO=static # đắt chế độ static để ip máy luôn được giữ nguyên
NAME="System eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
IPADDR=192.168.1.44 #đặt địa chỉ cho máy, lưu ý trong dải mạng thì địa chỉ các máy phải khác nhau
NETMASK=255.255.255.0

Sau đó ta cần phải restart lại card mạng để máy nhận địa chỉ mới này

# /etc/init.d/network restart

OK sau khi đã đặt địa chỉ ip máy, chúng ta cần khai báo các địa chỉ và tên host để các máy có thể nói chuyện với nhau thông qua host name mà ko cần thông qua những địa chỉ ip nhàm chán (tuy nhiên có một số trường hợp mình dùng host name thì thằng yarn lúc chạy nó báo lỗi khi map thành địa chỉ khi gọi sang máy client khác, lúc này mình phải chuyển về dùng địa chỉ ip thì lại ngon lành :-?)

Để chỉnh host name trong mạng mình cần vào file host để thêm

# vi /etc/host

## thêm nội dung sau vào file

192.168.1.10 master.spark.com
192.168.1.11 slave1.spark.com
192.168.1.12 slave2.spark.com

Kế tiếp ta cần để các máy có thể nói chuyện (ssh) trực tiếp với nhau thông qua share ssh key

đầu tiên ta cần sinh ra key trên 1 máy

# ssh-keygen -t rsa   #Use –t dsa for generating DSA key pairs
Generating public/private rsa key pair.
Enter file in which to save the key (/home/varun/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/varun/.ssh/id_rsa.
Your public key has been saved in /home/varun/.ssh/id_rsa.pub.
The key fingerprint is:
c7:b6:b0:ec:b4:e7:67:ea:18:82:a8:b2:00:fd:e8:fa [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
| .       .       |
|. .     S +      |
|.  + . . = .     |
|. o o . = .      |
|oo     + +. o    |
|=+E     ++++     |
+-----------------+

kế tiếp ta cần tạo 1 file authorized_keys từ file public key mà ta vừa tạo ra dựa trên câu lệnh trên

$cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

kế tiếp ta cần thêm quyền cho file key vừa tạo

#chmod 644 ~/.ssh/authorized_keys

để các máy nói chuyện đc với nhau thì ta cần copy thư mục ssh này sang các máy còn lại. Tuy nhiên mình khuyên các bạn mới vọc vạch nên tạo 1 máy cơ sở rồi từ đó bạn tạo file image ứng với máy đó. Tiếp đến bạn chỉ cần copy image này sang các máy khác sửa lại ip và chạy sẽ đỡ công config/tải/cài đặt khá nhiều.

OK, sau khi đã xong các bước trên tiếp theo là các bạn phải tắt tường lửa (iptable) trên centos để các máy có thể nói chuyện, chuyển file với nhau trong mạng hệ thống

$ service iptable stop
$ yum -y install openssh-server openssh-clients

À quên bạn còn nên cài thêm ssh vào máy nữa nhé

Ok sau khi đã hoàn thành các bước cơ sở trên, kế tiếp ta cần download gói hadoop về

$ cd /opt/
$ wget http://apache.bytenet.in/hadoop/common/stable/hadoop-2.6.0.tar.gz
$ tar –xvf hadoop-2.6.0.tar.gz

Đây là mình đang cài bản 2.6.0, các bạn nên cài bản mới nhất thông qua trang web của hadoop hoặc vào luôn link này để chọn bản mới nhất https://archive.apache.org/dist/hadoop/core/ Tiếp theo bạn cần cài đặt biến cho chương trình bằng cách edit file/etc/profile và thêm các giá trị sau

$ echo "" >> /etc/profile
$ echo "### HADOOP Variables ###" >> /etc/profile
$ echo "export HADOOP_HOME=/opt/hadoop-2.6.0" >> /etc/profile
$ echo "export HADOOP_INSTALL=\$HADOOP_HOME" >> /etc/profile
$ echo "export HADOOP_MAPRED_HOME=\$HADOOP_HOME" >> /etc/profile
$ echo "export HADOOP_COMMON_HOME=\$HADOOP_HOME" >> /etc/profile
$ echo "export HADOOP_HDFS_HOME=\$HADOOP_HOME" >> /etc/profile
$ echo "export YARN_HOME=\$HADOOP_HOME" >> /etc/profile
$ echo "export HADOOP_COMMON_LIB_NATIVE_DIR=\$HADOOP_HOME/lib/native" >> /etc/profile
$ echo "export PATH=\$PATH:\$HADOOP_HOME/sbin:\$HADOOP_HOME/bin" >> /etc/profile

Tiếp đến bạn cần để cho máy load các đường dẫn mà bạn khai báo ở trên bằng lệnh

$source /etc/profile

Kế tiếp ta cần cài đặt môi trường cho hadoop Bạn cần tạo các thư mục sau

$ mkdir -p /data/hadoop-data/nn
$ mkdir -p /data/hadoop-data/snn
$ mkdir -p /data/hadoop-data/dn
$ mkdir -p /data/hadoop-data/mapred/system
$ mkdir -p /data/hadoop-data/mapred/local

Kế đến bạn cần cập nhật đường dẫn java cho hadoop bằng cách sửa file $HADOOP_HOME/etc/hadoop/hadoop-env.sh tìm dòng có JAVA_HOME và thêm khai báo sau

$ export JAVA_HOME=/usr/java/jdk1.8.0_40/

Tiếp theo bạn cần thêm config cho hệ thống hadoop

Bạn cần vào thư mục $HADOOP_HOME/etc/hadoop/

cd $HADOOP_HOME/etc/hadoop/

Đầu tiên là file hdfs-site.xml

bạn cần sửa như sau

# vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>file:///data/hadoop-data/nn</value>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>file:///data/hadoop-data/dn</value>
    </property>
    <property>
        <name>dfs.namenode.checkpoint.dir</name>
        <value>file:///data/hadoop-data/snn</value>
    </property>
</configuration>

tiếp đến là file core-site.xml

#vim core-site.xml

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master.spark.com:9000</value>
    </property>
</configuration>

mapred-site.xml, file này config để sử dụng yarn cho hadoop, nếu ko thì hadoop sẽ dùng mặc định của hệ thống là map-reduce

#vim mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

yarn-site.xml

#vim yarn-site.xml

<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master.spark.com</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

tiếp theo bạn cần tạo file slaves để thông báo các máy nào sẽ dùng để xử lý thông tin

#vim slaves

master.spark.com
slave1.spark.com
slave2.spark.com

ở đây các bạn có thể tận dụng luôn con master để xử lý như 1 máy client cũng được, nhưng trong hệ thống lớn hơn thì nên tách riêng con master chỉ có nhiệm vụ quản lý các task thôi, không nên cho vào file slaves này

Như vậy là quá trình cài đặt hadoop trên 1 máy đã xong (lát nữa sau khi cài xong sprak chúng ta sẽ tạo file image để clone sang các máy khác)

Bước 3 Cài đặt Spark

Trước hết ta cần tải gói tin cài đặt spark

$ cd /home/
$ wget http://d3kbcqa49mib13.cloudfront.net/spark-1.0.1.tgz
$ tar –xvf spark-1.0.1.tgz

thiết lập thông tin môi trường cho sprak bằng cách tạo file /home/spark-1.0.1-bin-hadoop2/conf/spark-env.sh với nội dung thêm vào như sau

#/home/spark-1.0.1-bin-hadoop2/conf/spark-env.sh

SPARK_JAVA_OPTS=-Dspark.driver.port=53411
HADOOP_CONF_DIR=$HADOOP_HOME/conf
SPARK_MASTER_IP=master.spark.com

Tiếp tục tạo file cấu hình /home/spark-1.0.1-bin-hadoop2/conf/spark-defaults.conf

#/home/spark-1.0.1-bin-hadoop2/conf/spark-defaults.conf

spark.master            spark://master.spark.com:7077 #khai báo spark chọn làm master và cổng giao tiếp sang các máy client khác
spark.serializer        org.apache.spark.serializer.KryoSerializer #cái này là 1 phương pháp nén/giải nén truyền dữ liệu trong spark hay được suggest trong các bài viết cài đặt spark chi tiết bạn có thể tham khảo ở bài viết này http://spark.apache.org/docs/latest/tuning.html

kế tiếp ta cần khai báo các máy slaves giống như bên hadoop ở file /home/spark-1.0.1-bin-hadoop2/conf/slaves

# /home/spark-1.0.1-bin-hadoop2/conf/slaves

master.spark.com
slave1.spark.com
slave2.spark.com

OK vậy là ta đã cài đặt xong đầy đủ hệ thống trên 1 máy, khá là phức tạp nhưng cứ làm vài lần là các bạn sẽ quen thôi 😃. Kế tiếp bạn cần tạo Image cho máy này sau đó clone sang các máy khác và nhớ đổi ip tương ứng với các host khai báo ở file /etc/host. Hoặc nếu các bạn muốn luyện tập thêm thì có thể cài đặt tay tiếp các máy còn lại (very good pratice hehe 😃 ), sau khi cài máy phụ các bạn nên chẹc lại các biến môi trường hoặc chạy lại lệnh

$source /etc/profile

để load các đường dẫn môi trường cần thiết cho hadoop

Bước 4 Chạy Hệ thống

Sau khi cài đặt xong các máy client khác chúng ta cần vào master để bật dịch vụ hệ thống lên

Đầu tiên ta sẽ phải bật hadoop lên

# format lại tên của node
$ hdfs namenode –format

# bật HDFS (hadoop distributed file system)

$HADOOP_HOME/sbin/start-dfs.sh

# tắt HDFS
$HADOOP_HOME/sbin/stop-dfs.sh

# bật dịch vụ yarn
$HADOOP_HOME/sbin/start-yarn.sh

# dừng dịch vụ yarn
$HADOOP_HOME/sbin/stop-yarn.sh

nếu có lỗi các bạn có thể check file log của hadoop (được in ra ngay trên màn hình chạy) để xem thông báo lỗi ở đâu và sửa nó 😃

Kế đến ta sẽ phải bật spark lên

# bật spark
$ /home/spark-1.0.1-bin-hadoop2/sbin/start-all.sh

#tắt spark
$ /home/spark-1.0.1-bin-hadoop2/sbin/stop-all.sh

sau đó bạn check log trên màn hình để biết xem là hệ thống đã chạy ổn chưa, có lỗi thì lại google thôi 😃

DONE! Vậy là bạn đã tự tay setup thành công hệ thống spark rồi đó, ở phần tới mình sẽ hướng dẫn 1 vài practice trên sprak để các bạn có thể áp dụng vào dịch vụ mà bạn muốn.

quan điểm cá nhân của mình là các bạn nên thử tập cài đặt bằng tay hệ thống sẽ tốn 1-vài ngày, dù là các bạn sử dụng dịch vụ của amazon thì việc cài đặt này sẽ giúp bạn hiểu về hệ thống hoạt động spark tốt hơn. Còn nếu dùng dịch vụ thì mình khuyên là nên dùng hệ thống của Amazon vì độ ổn định, khả năng mở rộng cũng như giảm bớt hệ thống rất đơn giản và dễ dùng => các bạn sẽ có thời gian để phát triển các dịch vụ khác phục vụ khách hàng tốt hơn 😃.

Cám ơn đã đọc hết bài viết của mình Các bài viết tham khảo:

http://backtobazics.com/big-data/6-steps-to-setup-apache-spark-1-0-1-multi-node-cluster-on-centos/

http://backtobazics.com/big-data/setup-multi-node-hadoop-2-6-0-cluster-with-yarn/

http://spark.apache.org/docs/latest/cluster-overview.html

http://spark.apache.org/docs/latest/tuning.html