Một thoáng Hadoop

Hadoop thường gắn liền với biểu tượng là hình ảnh chú voi vui vẻ màu vàng. Vậy Hadoop là gì, có gì hấp dẫn không? Bài viết này nhằm chia sẻ những kiến thức cơ bản về Hadoop mà người viết bài rút ra được từ một khóa học trực tuyến trên website Udacity 

1. Big Data

Trước khi nói về Hadoop, hãy giành chút thời gian nói về Big Data. IBM ước tính 90% dữ liệu trên toàn thế giới được tạo ra trong 2 năm gần đây. Mỗi ngày có một lượng lớn dữ liệu được tạo ra bởi người dùng trên các mạng xã hội, mua bán trực tuyến, chia sẻ hình ảnh, ..

 Big Data là gì? Mặc dù chưa có định nghĩa chính xác cho Big Data, nhưng thông thường khi nhắc tới nó người ta thường nhắc tới khối lượng dữ liệu mà việc xử lý chúng trên một máy tính đơn rất khó khăn và mất nhiều thời gian, chứa các đặc tính sau :

  • Volume: kích cỡ dữ liệu (rất lớn)
  • Velocity: tốc độ sinh ra dữ liệu (rất nhanh)
  • Variety: sự đa dạng về nguồn gốc và định dạng dữ liệu (rất đa dạng)

 Vấn đề đặt ra : làm sao để lưu trữxử lý hiệu quả một lượng lớn dữ liệu được tạo ra mỗi ngày như vậy?

Hadoop được phát triển để giải quyết tốt việc này. ( Hadoop ban đầu được phát triển và khởi xướng bởi Doug từ 2003 dựa trên một số tài liệu nội bộ Google công bố).

2. Hadoop

Ý tưởng chính của Hadoop là việc chia nhỏ và lưu dữ liệu ở trên một nhóm nhiều máy tính, và khi muốn thao tác với dữ liệu chúng ta sẽ xử lý ngay trên máy mà dữ liệu đó được lưu trữ, giúp tiết kiệm thời gian lấy dữ liệu ở nơi khác. Ngoài ra cấu trúc của Hadoop cũng giúp việc Scale hệ thống theo chiều ngang (Horizontal Scaling) trở nên dễ dàng. Hadoop gồm 2 phần chính : HDFS (Hadoop Distributed File System) và MapReduce

HDFS, hệ lưu trữ dữ liệu hiệu quả

  • Một file được chia thành các khối nhỏ dung lương 64Mb. Các khối này được lưu trên các node khác nhau trong cluster và được đặt tên theo blk_xxxxxx. Trên mỗi node sẽ có một phần mềm chạy để quản lý thông tin về các khối dữ liệu này gọi là DataNode.
  • Do các khối của một file nằm rải rác ở các node trong 1 cluster, làm sao chúng ta có thể biết những khối nào tạo nên file đó? Thông tin đó gọi là ‘metadata’ và được lưu trên một máy gọi là NameNode.
  • Mỗi block được tạo ra các bản sao và lưu trên 3 nodes khác nhau để đảm bảo tính “Redundancy”
  • Chúng ta có 2 máy NameNode chạy song song, một active một standby để đảm bảo tính high “Availability”

MapReduce, cách xử lý dữ liệu hiệu quả.

  • Dữ liệu đầu vào được chia thành nhiều phần nhỏ, các phần nhỏ dữ liệu này sẽ được xử lý song song cùng lúc
  • Gồm có 2 pha chính : Mapper và Reducer
  • MapReduce gồm các tiến trình chạy nền :

                     – JobTracker
                     – TaskTracker

  • Khi chạy một MapReducejob, code sẽ được đưa lên JobTracker, từ đó nó chia nhỏ ra các Mapper và Reducer để chạy trên các Node trong Hadoop Cluster. Trên các Node này, các tiến trình TaskTracker sẽ đảm nhiệm việc thực thi code, cùng với dữ liệu nằm trên chính Node này (cũng chính là DataNode được nói đến ở phần HDFS trên)

Có thể lấy một ví dụ đơn giản để hiểu về cách làm việc của Mapper và Reducer.

Một ngày đẹp trời, bạn sẽ nhận được thừa kế 99 bao tải chứa lẫn lộn các loại tiền khác nhau : USD, VND, JPY với điều kiện bạn phải tính được tổng giá trị mà mình được thừa kế mà không được dùng máy đếm tiền. Thời hạn là 1 ngày bạn phải hoàn thành xong. Nếu bạn tự đếm một mình thì sẽ khó khả thi. Có một cách là bạn sẽ nhờ 33 người bạn, mỗi người sẽ mở 3 bao tải tiền để phân loại và xếp tiền thành 3 cột, 1 cột là các tờ USD, 1 cột là các tờ VND, 1 cột là các tờ JPY. Tiếp theo bạn nhờ 3 người nữa, mỗi người sẽ phụ trách một loại tiền, đến từng nơi của 33 người kia để gom loại tiền mà mình phụ trách và sau đó đếm tổng số tiền mà mình thu được. Cuối cùng bạn chỉ cần đi hỏi 3 người này để biết tổng giá trị số tiền.

Liên tưởng tới mô hình của Hadoop thì :

  • 99 bao tải tiền chứa lẫn lộn USD, VND, JPY → là big data
  • các bao tải → các block dữ liệu
  • nhóm 33 người → các Mapper
  • nhóm 3 người → các Reducer

Một số phần mềm mã nguồn mở được phát triển nhằm giúp việc sử dụng Hadoop dễ dàng hơn. Từ đó tạo nên một tập hợp các ứng dụng phát triển xung quanh Hadoop được gọi là “hệ sinh thái Hadoop”. Các ứng dụng như Hive, Pig … giúp người dùng viết code truy vấn dữ liệu dễ dàng thay vì viết code MapReduce khá phức tạp. Tuy nhiên sau đó code vẫn phải chạy trên MapReduce. Đã có những ứng dụng đã được phát triển để chạy trực tiếp code mà không cần phải chuyển sang MapReduce code để chạy nhằm tăng tốc độ ứng dụng.

3. Ứng dụng thực tế

Hadoop có rất nhiều ứng dụng thực tế, có thể được dùng trong các trường hợp khác nhau. Ban đầu Hadoop chỉ hỗ trợ Java, sau đó tính năng “Hadoop Streaming” được phát triển để có thể triển khai MapReduce trên các ngôn ngữ khác. Hãy thử viết một đoạn code Python nhỏ theo mô hình MapReduce để phân tích web logs

Một dòng trong log file có định dạng như sau:

x.x.x.x - - [23/Jun/2014:04:07:12 +0000] "GET / HTTP/1.1" 200 1116 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36" "-"

* Viết Mapper để lấy mỗi địa chỉ IP từ logs file, mỗi lần IP xuất hiện thì in ra địa chỉ IP và giá trị 1 (thể hiện 1 request) :

#!/usr/bin/python

import sys

for line in sys.stdin:

    data = line.strip().split(" ")

    if len(data) == 22:

        ip, identity, username, finishtime, sczone, getorset, page, http, status, size, a, b, c, d, e, t, w, l, p, os, od, ww = data

        print "{0}\t{1}".format(ip,1)

* Viết Reducer để đếm tổng số lần mỗi địa chỉ IP truy cập site, dữ liệu đầu vào được lấy từ dữ liệu đầu ra của Mapper :

#!/usr/bin/python

import sys

hit_number = 0

old_key = None

for line in sys.stdin:

    data_mapped = line.strip().split("\t")

    if len(data_mapped) != 2:

        continue

    this_key, this_hit = data_mapped

    if old_key and old_key != this_key:

        print old_key, "\t", hit_number

        old_key = this_key

        hit_number = 0

    old_key = this_key

    hit_number += 1

if old_key != None:

    print old_key, "\t", hit_number

Kết quả sau khi chạy sẽ thu được một file chứa thông tin định dạng:

IP_Address         Tổng_số_lần_truy_cập

Sau đó bạn có thể đưa dữ liệu này vào database chẳng hạn như mysql, dùng thư viện GeoIP để xử lý xác định xem địa chỉ ip từ country nào. Hiển thị dữ liệu này lên web, chẳng hạn như 10 IPs truy cập nhiều nhất  :

Các địa chỉ IP trên hình ảnh đã được thay đổi so với địa chỉ IP thực để tránh các trường hợp đáng tiếc xảy ra (:D).Hy vọng bài viết một phần nào giúp người đọc mới tìm hiểu có được một cái nhìn cơ bản về Hadoop.

Xin cám ơn nếu bạn đã kiên nhẫn đọc tới đây HEHEHE !

Tags:

Add a Comment

Scroll Up