Apache Spark คือ Framework ในการเขียนโปรแกรมเพื่อประมวลผลแบบ MapReduce
ในบทความนี้จะกล่าวถึงการสร้าง environment สำหรับทดสอบโปรแกรม Spark โดยใช้ Cloudera Quickstart
Cloudera Quickstart คือ image ของ Virtual Machine โดยมีให้ทั้ง VirtualBox, VMWare และ Docker ในที่นี้จะแสดงการติดตั้งโดยใช้ Docker

ในขึ้นแรกคือการดึง docker image ของ quickstart เวอร์ชั่นล่าสุดลงมาก่อน
docker pull cloudera/quickstart:latest
ตรรวจสอบ ว่ามี image ที่ดึงลงมาหรือไม่
docker images

รันคำสั่ง docker run เพื่อสร้าง container
docker run --hostname=quickstart.cloudera --privileged=true -t -i \ -p 8888 -p 7180 -d cloudera/quickstart /usr/bin/docker-quickstart
-i -t เพื่อเปิด interactive ให้สามารถเข้า container จาก terminal ได้
–hostname และ -p เพื่อเปิด port ของ docker container ให้สามารถเข้าถึงจากภายนอกผ่าน browser ได้
-d เพื่อให้ container รันใน background ไม่ปิดตัวเองเมื่อปิดหน้า terminal แล้ว
เมื่อสร้าง container เสร็จแล้วใช้คำสั่ง docker ps เพิ่มดู container hash
docker ps

รัน docker attach เพิ่มเชื่อมต่อ terminal กับ container โดยใช้ container id ที่ดูจาก docker ps เมื่อกี้ นั่นคือ 3d2dadaeb9e6
docker attach 3d2dadaeb9e6
เมื่อ attach เสร็จ terminal จะกลายเป็น root@quickstart
![]()
ขั้นต่อไปคือเปิด cloudera manager
/home/cloudera/cloudera-manager --express --force
ใช้เวลาสักหน่อย

เมื่อเสร็จแล้วจะมี port ที่ใช้เข้า cloudera manager แล้ว login ขึ้นมา
แต่ยังเข้าไม่ได้ ต้อง forward port จาก docker มาก่อน
ใช้คำสั่ง docker port [container id] [port] โดยรันจาก terminal ในเครื่อง host ไม่ใช่จาก container
docker port 3d2dadaeb9e6 7180
ผลลัพธ์
![]()
นั่นคือเราสามารถเข้าไปที่ http://quickstart.cloudera:7180 ได้จาก 0.0.0.0:32771 ทาง browser

ใส่ login

ดูแถบด้านซ้าย จะบอกว่ามี service ไหนรันอยู่บ้าง และมีปัญหาอะไร อันแรกเลยคือ Hosts จะเห็นว่ามี error อยู่ 1 อัน

เมื่อกดเข้าไปดูจะพบว่าเป็น error Clock Offset

แก้ด้วยการติดตั้ง NTP server แล้ว sync นาฬิกาของ server ให้ตรงกัน
yum install ntp chkconfig ntpd on service ntpd start ntpdate -u pool.ntp.org hwclock --systohc
จากนั้นเพื่อใช้งาน spark จะเปิด service Hive, HDFS, YARN และ Spark โดยคลิดที่ลูกศรข้าง service แล้วกด start เพื่อเริ่มการทำงาน

เมื่อเปิด service ที่จำเป็นหมดแล้วก็สามารถเริ่มใช้ spark ได้
ในบทความนี้จะแสดงตัวอย่างโปรแกรม WordCount ซึ่งเป็นโปรแกรมพื้นฐานในการรัน MapReduce
ก่อนอื่น เตรียม input ที่จะเอามานับคำก่อน ซึ่งสามารถหาได้จากโปรแกรมสุ่มคำ ตัวอย่างเช่น
นำมาเก็บลงไฟล์ (ด้วย vi หรือ text editor อื่นๆ) ในที่นี้ใช้ชื่อ input.txt
Spark จะอ่านไฟล์จาก HDFS (Hadoop file system) ได้ โดย hdfs นี้จะเป็น file system ซึ่งสามารถมองเห็นได้จากทุก node ใน yarn
ใช้คำสั่ง hdfs เพื่อ copy ไฟล์ไปไว้ใน hdfs
hdfs dfs -put input.txt /tmp/input.txt
และตรวจสอบดูว่าใน hdfs มีไฟล์ถูกต้องหรือไม่
hdfs dfs -ls /tmp/

ใน image ของ cloudera นี้ ตัว spark จะถูกติดตั้งไว้ที่ /usr/lib/spark ซึ่งเราสามารถรัน spark-shell ได้จากที่นี่
/usr/lib/spark/bin/spark-shell

spark-shell จะใช้เวลาในการเริ่มทำงานสักพัก เมื่อพร้อมใช้งานแล้วจะขึ้นว่า scala>
Script ด้านล่างคือตัวอย่างโปรแกรม word count
val myfile = sc.textFile("hdfs://quickstart.cloudera:8020/tmp/input.txt")
val counts = myfile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://quickstart.cloudera:8020/tmp/out")
โดยโปรแกรมจะอ่านไฟล์อินพุตจาก hdfs /tmp/input.txt แล้ว split ด้วย space แล้ว map จาก word ที่ split มา
การ reduce คือการนับ word ที่เจอซ้ำๆในไฟล์ input นั่นเอง
บรรทัดสุดท้ายคือการบอกให้โปรแกรมเก็บ output ไว้ที่ /tmp/out/
เมื่อโปรแกรมรันเสร็จแล้ว ออกจาก spark shell ด้วยคำสั่ง exit
แล้ว ตรวจดู output ใน hdfs
hdfs dfs -ls /tmp/out/

ผลลัพธ์จะอยู่ใน part-00000 และ part-00001 เปิดดูได้ด้วย -cat
hdfs dfs -cat /tmp/out/part-00000

ผลลัพธ์ในแต่ละบรรทัด คือคำที่เจอ , จำนวนที่นับได้
เมื่อทำงานเสร็จแล้ว หากต้องการออกจาก cloudera container โดยที่ยังปล่อย container รันไว้
ให้ออกด้วย ctrl+p ctrl+q terminal จะกลับมาที่เครื่องโดยที่ container ยังรันอยู่
แต่หากใช้คำสั่ง exit จะเป็นการปิด container ไปเลย
. . . . . . . . . . .
หากว่าคุณกำลังสนใจการสร้างโมเดลพยากรณ์ หรือทำงานอื่นๆ ที่เกี่ยวกับ Big Data, ทีม บานาน่าโคดดิ้ง ของเรา มีทีมงานผู้เชี่ยวชาญที่จะช่วยให้งานของคุณสำเร็จได้อย่างสมบูรณ์ สามารถดูรายอะเอียดได้ที่ BananaCoding.com/big-data