มือใหม่ Apache Kafka part 1

Phai Panda
5 min readMar 4, 2021

--

เห็นทีมข้างๆเขานั่งคุยกัน อยากร่วมวงด้วยแต่รู้ตัวว่าตนเป็นเด็กอ่อนวัยรุ่นแรกเกิด หยุดนี้จึงคิดว่าหาความรู้ใส่ตนดีกว่า สำหรับเพื่อนคนไหนก็ตามที่ยังไม่รู้จักคำว่า 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
cat อ่าน server.log

หรือจะเปิดด้วยโปรแกรม VS Code ก็ได้

ms vs code อ่านไฟล์ server.log

หมายความว่าเพื่อให้ Kafka ทำงานได้เราจำเป็นต้องรัน Zookeeper ก่อน

กลับมาที่ kafka folder แล้วรัน Zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties
zookeeper มีชีวิตแล้ว

มันจะต้องทำงานได้โดยไม่มี error ใดๆ ให้เปิดทิ้งไว้อย่างนั้นแหละ

กลับไปรัน Kafka broker อีกครั้งด้วยการเปิด Terminal ใหม่ขึ้นมาแล้วเข้าไปยัง kafka folder พิมพ์

bin/kafka-server-start.sh config/server.properties
yes! สร้าง broker ได้สำเร็จ

ไฟล์ Configuration

จากรูปข้างต้นได้ว่า brokerId มีค่าเท่ากับ 0 ค่านี้สามารถอ่านได้จากไฟล์ server.properties ลองไปดูสิ

broder id เป็น 0 ถูกกำหนดไว้ที่นี่

นอกจากนี้ยังมีการสร้าง 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 หรือหนึ่งตัวขึ้นไป

1 cluster จาก codeblog

ภายใน cluster ใดๆสามารถออกแบบได้ว่าต้องการ broker เท่าไร ตัวอย่างนี้คือ 3 brokers

1 cluster 3 brokers จาก cloudkarafka

เรายังสามารถรัน Kafka ได้มากกว่าหนึ่ง cluster เรียกว่า multiple Kafka clusters ตัวอย่าง 2 clusters

multiple clusters จาก altoros

ส่วนรายละเอียดอีกหลายชื่อที่ปรากฏแต่ยังไม่ได้แนะนำจากภายในรูปไว้เราค่อยทำความรู้จักไปพร้อมกันนะ

รู้จักกับ 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

เครดิต Stéphane Maarek

ภายใน 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 ถัดไปเรามาต่อกัน สวัสดีครับ

--

--

No responses yet