มือใหม่ Apache Kafka part 1
เห็นทีมข้างๆเขานั่งคุยกัน อยากร่วมวงด้วยแต่รู้ตัวว่าตนเป็นเด็กอ่อนวัยรุ่นแรกเกิด หยุดนี้จึงคิดว่าหาความรู้ใส่ตนดีกว่า สำหรับเพื่อนคนไหนก็ตามที่ยังไม่รู้จักคำว่า streaming platform เพื่อการ distributed event เรามาคุยกันครับ
ผมอยากเน้นที่เข้าใจแล้วลงมือทำ ไม่ก็ลงมือทำแล้วทำความเข้าใจ ส่วนทฤษฎีไว้เราค่อยตามไปเก็บกันภายหลัง :) มือใหม่คงอยากจะเล่นจะรันอะไรนิดๆหน่อยๆให้มันเคยชินแล้วจะสนิทกันไปเอง (หมายถึงสนิทกับ Kafka นะ)
ขณะนี้ผมใช้เครื่อง Mac ดังนั้นหลายรูปภาพก็จะ interface ด้วย UI ของ MacOS เพื่อนที่ใช้ Windows อาจไม่คุ้นตา อาจรวมถึงโปรแกรมที่ใช้ด้วย
เนื้อหาทั้งหมดของ part นี้
- ดาวน์โหลด Apache Kafka (ด้วย curl)
- ภายใน kafka folder มีอะไรบ้าง
- รัน Kafka Server
- ไฟล์ Configuration
- รู้จักกับ Kafka Clusters
- รู้จักกับ Kafka Topics
- รู้จักกับ Kafka Producer กับ Kafka Consumer
ดาวน์โหลด
ตรงไปที่ kafka.apache.org มองบนหน่อยเลือกปุ่มที่เขียนว่า DOWNLOAD KAFKA
เลือกเวอร์ชันล่าสุดที่ stable ตอนนี้คือ 2.7.0
คลิกเข้าไปดาวน์โหลดได้เลย แต่ผมจะลองใช้ curl โหลด ดังนั้นจึงคัดลอกลิงก์นี้ไว้ก่อน
ความจริงแล้วดาวน์โหลด คัดลอก — วาง แกะ .tgz ธรรมดาก็ได้
ใครที่ใช้ curl เหมือนผมก็สามารถทำแบบนี้ที่ Terminal
curl https://downloads.apache.org/kafka/2.7.0/kafka_2.13-2.7.0.tgz --output kafka.tgz
คำสั่งข้างต้น --output
ระบุให้ output เป็นไฟล์ชื่อ kafka.tgz (หากไม่รู้จัก .tgz ให้นึกถึงโปรแกรม zip หรือ winrar มันเป็นประเภทเดียวกัน)
สร้าง folder ชื่อ kafka จากนั้นย้าย kafka.tgz ไปไว้ด้านในก่อนจะแกะไฟล์ .tgz
tar -xvzf kafka.tgz --strip 1
ผล
ซึ่งตอนนี้ kafka.tgz จะลบหรือเก็บไว้ก็ได้
ภายใน kafka folder
ประกอบด้วย folder ต่อไปนี้
- bin เก็บไฟล์ shell ที่มีนามสกุล .sh ในนี้ยังมี windows folder ซึ่งเก็บไฟล์ batch ที่มีนามสกุล .bat
ไฟล์ทั้งหมดใน bin folder สามารถ execute ได้ เรียกว่า executable file - config เก็บไฟล์ .properties ที่ใช้กับ executable file เช่น zookeeper.properties ใช้เพื่อ start โปรแกรม Zookeeper ส่วน server.properties ใช้ start โปรแกรม Kafka
- libs เก็บไฟล์ .jar ซึ่งจะถูกเรียกทำงานโดยโปรแกรม java
- site-docs คือ document ของ Apache Kafka เวอร์ชันที่เราได้ดาวน์โหลดมา
- logs เก็บไฟล์ .log แต่แรกเริ่มจะยังไม่สร้างขึ้นจนกว่า executable file จะถูกทำงาน ประดาไฟล์เหล่านี้จะตั้งชื่อแยกตาม executable file ที่ได้ทำงานนั้นๆ
Apache Kafka รันด้วยโปรแกรม java ดังนั้นอย่าลืมว่าที่เครื่องของเราได้ติดตั้งมันไว้แล้ว (ผมติดตั้ง jre 1.8) ทดสอบด้วย
java -version
ควรได้ผลลัพธ์ประมาณนี้java version “1.8.0_231”
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
รัน Kafka Server
Kafka server จะถูกเรียกว่า broker หรือ Kafka broker ซึ่งเราสามารถรันมันได้มากกว่า 1 broker ทว่าตอนนี้ขอลองแค่หนึ่งก่อน
เมื่ออยู่ใน kafka folder พิมพ์
bin/kafka-server-start.sh config/server.properties
kafka-server-start.sh จะอ่าน server.properties แล้วพยายามสร้าง Kafka broker ขึ้นทว่ากลับปรากฏ
ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
มันถามหาการเชื่อมต่อไปยังโปรแกรม Zookeeper
จังหวะนี้ใน kafka folder เราจะเห็นว่า logs folder ถูกสร้าง
เข้าไปดู
cd logs
cat server.log
หรือจะเปิดด้วยโปรแกรม VS Code ก็ได้
หมายความว่าเพื่อให้ Kafka ทำงานได้เราจำเป็นต้องรัน Zookeeper ก่อน
กลับมาที่ kafka folder แล้วรัน Zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
มันจะต้องทำงานได้โดยไม่มี error ใดๆ ให้เปิดทิ้งไว้อย่างนั้นแหละ
กลับไปรัน Kafka broker อีกครั้งด้วยการเปิด Terminal ใหม่ขึ้นมาแล้วเข้าไปยัง kafka folder พิมพ์
bin/kafka-server-start.sh config/server.properties
ไฟล์ Configuration
จากรูปข้างต้นได้ว่า brokerId มีค่าเท่ากับ 0 ค่านี้สามารถอ่านได้จากไฟล์ server.properties ลองไปดูสิ
นอกจากนี้ยังมีการสร้าง log เพิ่มโดยดูจากไฟล์ .properties เช่นกัน
- Kafka broker อยู่ที่
/tmp/kafka-logs
- Zookeeper อยู่ที่
/tmp/zookeeper
ถามว่าทราบได้อย่างไร?
ง่ายมาก ลองกลับไปดูคำสั่งรัน Zookeeper ที่ว่า config/zookeeper.properties
เลื่อนหาแล้วก็จะพบแสงสว่าง
ทีนี้เรารู้แล้วว่ามันเก็บ log ขณะทำงานไว้ที่ไหนรวมถึงกำหนดค่าอะไรไว้บ้าง ส่วน Kafka broker ก็ให้ไปดูที่ config/server.properties
รู้จักกับ Kafka Clusters
จาก .properties ที่ผ่านมาทำให้รู้ว่า
- Zookeeper โดย default รันที่ localhost:2181
- Kafka broker โดย default รันที่ localhost:9092
เราเรียกคู่นี้ว่า Kafka cluster
หนึ่ง cluster จะประกอบด้วย Kafka broker อย่างน้อยหนึ่ง server หรือหนึ่งตัวขึ้นไป
ภายใน cluster ใดๆสามารถออกแบบได้ว่าต้องการ broker เท่าไร ตัวอย่างนี้คือ 3 brokers
เรายังสามารถรัน Kafka ได้มากกว่าหนึ่ง cluster เรียกว่า multiple Kafka clusters ตัวอย่าง 2 clusters
ส่วนรายละเอียดอีกหลายชื่อที่ปรากฏแต่ยังไม่ได้แนะนำจากภายในรูปไว้เราค่อยทำความรู้จักไปพร้อมกันนะ
รู้จักกับ Kafka Topics
Kafka topic คือชื่อ category หรือชื่อ feed หรือชื่อกลุ่มของข้อมูลที่เราต้องการบันทึก (record) และนำไปเผยแพร่ (publish)
topic นี้ต้องมีชื่อไม่ซ้ำกันและถูกเก็บไว้ที่ไหนสักแห่ง …เดี๋ยวเราไขดูครับ
ทดลองสร้าง Topic
ดูใน bin folder จะพบไฟล์ kafka-topics.sh
พิมพ์ไปเท่านี้พอ
bin/kafka-topics.sh
มันจะบอกเองเลยว่ารายละเอียดของคำสั่งที่ต้องระบุเพิ่มมีอะไรบ้าง
สร้าง topic ชื่อ provinces
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic provinces
ลองไปดูใน server.log สิ
อย่างที่เรารู้ตามเข้าไปดูในนี้ /tmp/kafka-logs
จากในรูปข้างต้นเห็นนั่นไหม นั่นคือ provinces topic ที่เราเพิ่งสร้างขึ้น มันประกอบด้วยชื่อ ขีดกลางและหลายเลข offset ที่เริ่มต้นด้วยศูนย์ (provinces-0) ภายในบรรจุไฟล์ที่น่าสนใจ
- 00000000000000000000.index
- 00000000000000000000.log
Topic Details
แอบได้ยินทีมตรงข้ามว่า “แกะๆ” “คือข้างในมันก็จะมี detail ของมันไง” ฟังแล้วก็…ไหนลองหน่อย
ณ kafka folder ใช้ Zookeeper ขอดูรายการทั้งหมด
bin/kafka-topics.sh --list --zookeeper localhost:2181
ตอนนี้ผลลัพธ์มีเพียง
provinces
งั้นขอดูรายละเอียดของมัน
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic provinces
โปรดสังเกตสิ่งที่เห็น ได้แก่ PartitionCount: 1, Partition: 0, Leader: 0 และ Replicas: 0 พวกนี้คืออะไร ให้เก็บไว้ในใจผมสัญญาว่าเราจะรู้จักมันทุกตัว แต่ต่อจากนี้ขอแนะนำ producer กับ consumer (เรามาลองของ)
รู้จักกับ Kafka Producer vs Kafka Consumer
ตรงตามชื่อเลยครับ Producer จะเป็นผู้ผลิตข้อมูล ส่วน Consumer จะเป็นผู้บริโภคข้อมูล
รูปต่อไปนี้ให้ดูเฉพาะ Kafka Producer กับ Kafka Consumer
ภายใน kafka folder ของเรา เราต้องการใช้งาน
- kafka-console-producer คือ producer รูปแบบ command-line
- kafka-console-consumer คือ consumer รูปแบบ command-line
ผมจะผลิตชื่อจังหวัดใส่เข้าไปใน province topic ที่ได้สร้างเอาไว้
kafka-console-producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic provinces
พิมพ์คำสั่งถูกต้องจะต้องได้ prompt แบบนี้ >
มาเริ่มกันเลย
จากตรงนี้ไม่ต้องปิด Terminal
ให้เปิด Terminal ใหม่ เรียก consumer มาเขมือบมันที
kafka-console-consumer
ที่ Terminal ใหม่ไปยัง kafka folder แล้วพิมพ์
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic provinces
consumer ขณะทำงานจะรอคอยข้อมูลใหม่ (มันไม่เห็นข้อมูลก่อนหน้านี้) ไหนลองเพิ่มรายชื่อจังหวัดที่ producer หน่อย
Khon Kaen
Kakhon Phanom
ผลลัพธ์ที่ consumer
เอ้~ไหนว่ากลุ่มของข้อมูลจะถูกบันทึกไว้ใช่ไหม ขอบริโภคตั้งแต่แรกเริ่มเลยได้ไหมล่ะ
ได้จ๊ะ ให้หยุด consumer ตัวปัจจุบันนี้แล้วรันใหม่พร้อม --from-beginning
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic provinces --from-beginning
ถึงเวลานี้ให้เพื่อนๆลองเปิด Terminal ใหม่อีก เพิ่ม kafka-console-consumer อีกตัว ผลิตรายชื่อจังหวัดแล้วชมผลลัพธ์
หรือแม้แต่อยากเพิ่ม kafka-console-producer อีกตัวก็ได้ ลองดู
เป็นอันว่าเราทำความรู้จัก Kafka ในแง่ของการชิมรสเท่านี้ก่อน อาจจะยังไม่เข้าใจว่าจะใช้มันทำประโยชน์อย่างไร ประกอบเข้าตรงไหน เพิ่มลดขนาดของมันได้ไหม บลาๆ part ถัดไปเรามาต่อกัน สวัสดีครับ