Nên chọn Hadoop hay Spark cho hệ thống Big Data

Spark vs Hadoop

Spark vs Hadoop

Sau khi Spark ra đời, chúng ta thường đặt câu hỏi “Nên chọn Hadoop hay Spark cho hệ thống Big Data?”. Trước đây, các hệ thống Hadoop thường có các công cụ đi kèm để xử lý dữ liệu như HBase, Mahout, Pig, Hive, … Nhưng các hệ thống này đều có điểm hạn chế về tốc độ xử lý và Spark ra đời để giải quyết vấn đề này. Hiện nay, hầu như bất kỳ dự án Big Data nào cũng sử dụng Spark. Thật chất ta không loại bỏ hệ thống Hadoop mà chính nhờ Hadoop mà Spark càng được tối ưu hóa quá trình đọc và xử lý dữ liệu.

Trong bài viết này, ta sẽ khảo sát sự khác biệt giữa hai hệ thống và làm thế nào để chọn được hệ thống phù hợp với nhu cầu  xử lý dữ liệu của doanh nghiệp. Ta sẽ làm một vài phép so sánh sự giống và khác nhau giữa chúng.

Hadoop và Spark đều là hệ thống dùng cho Big Data, chúng cung cấp những công cụ phổ biến nhất cho các tác vụ xử lý liên quan đến Big Data.

Hadoop overview

Hadoop overview

Hadoop, trong nhiều năm liền, là hệ thống Big Data mã nguồn mỡ dẫn đầu ngành. Nhưng sau này Spark nổi lên với những công nghệ xử lý tiên tiến hơn đã trở thành nền tảng nổi trội trong các công cụ của Apache Software Foundation.

Tuy nhiên, cả hai xử lý dữ liệu không hề giống nhau, và cũng không phải tách biệt hoàn toàn, vì ta có thể kết hợp để chúng hoạt động cùng nhau. Mặc dù Spark có khả năng tính toán nhanh gấp 100 lần so với Hadoop nhưng bản thân nó không cung cấp hệ thống lưu trữ phân tán (distributed-storage) như Hadoop.

Distributed storage

Distributed storage

Lưu trữ phân tán (distributed storage) là nền tảng của nhiều hệ thống Big Data ngày nay. Nó cho phép các tập dữ liệu lớn hàng petabyte (1,000,000 gigabytes) lưu trữ trên một số lượng gần như vô hạn các ổ đĩa cứng máy tính hiện nay, thay vì tốn kém chi phí và thời gian để cài đặt mọi thiết lập trên một thiết bị duy nhất. Các hệ thống này có khả năng mở rộng (scalable), nghĩa là ổ đĩa có thể được thêm vào hệ thống khi tập dữ liệu tăng lên.

Như đã đề cập, Spark không bao gồm hệ thống lưu trữ phân tán của riêng mình nên ta cần cung cấp phần mềm của bên thứ ba (third-party). Vì lý do trên mà nhiều dự án Big Data phải cài đặt Spark lên trên nền Hadoop, nhờ vậy mà các ứng dụng của Spark có thể sử dụng dữ liệu lưu trữ phân tán của Hadoop (Hadoop Distributed File System (HDFS)).

Điều khiến Spark nổi bật hơn Hadoop đó là tốc độ. Spark xử lý dữ liệu hầu hết trên bộ nhớ (in memory), nó copy dữ liệu từ ổ đĩa lưu trữ phân tán vào bộ nhớ RAM (có tốc độ đọc ghi nhanh hơn gấp nhiều lần), thay vì phải sử dụng hệ thống MapReduce của Hadoop để đọc ghi dữ liệu lên ổ cứng.

MapReduce

MapReduce

MapReduce ghi lại toàn bộ dữ liệu vào ổ đĩa vật lý trung gian sau mỗi lần thao tác để đảm bảo hệ thống có khả năng phục hồi toàn bộ dữ liệu cho những trường hợp xấu xảy ra (vì lưu trữ trên RAM dễ bị mất mát dữ liệu hơn ổ cứng). Cơ chế này cũng được tìm thấy trong cách lưu trữ của Spark được gọi là Resilient Distributed Datasets (các tập dữ liệu phân tán có khả năng phục hồi).

Chức năng của Spark trong các tác vụ xử lý dữ liệu nâng cao như real-time stream processing và machine learning đã vượt xa những gì mà Hadoop có thể làm. Cộng thêm tốc độ xử lý cao nhờ thao tác dữ liệu trên RAM đã giúp hệ thống này trở nên phổ biến trong thời gian qua.

Real-time processing (xử lý thời gian thực) nghĩa là dữ liệu có thể được nạp vào ứng dụng phân tích tại thời điểm hiện tại, và ngay lập tức hiển thị kết quả tính toán trên trang chủ (dashboard) của người dùng, nhờ vậy mà việc thao tác dữ liệu được tiến hành không bị ngắt quãng. Cơ chế xử lý này đang được các ứng dụng Big Data ứng dụng ngày càng tăng. Ví dụ, trong các hệ thống khuyến nghị (recommendation engines) được dùng bởi các nhà bán lẻ (retailers), hoặc theo dõi hiệu suất của máy móc công nghiệp trong ngành công nghiệp sản xuất.

Spark MLib

Spark MLib

Machine learning rất phù hợp khi áp dụng lên nền tảng Spark cho những tính toán đòi hỏi tốc độ cao và khả năng xử lý dữ liệu liên tục. Công nghệ này là trái tim của các hệ thống sản xuất tiên tiến. Ở đó, ta có thể dự đoán được khi nào các bộ phận bị lỗi và khi nào cần đặt hàng để thay thế. Thêm vào đó, công nghệ này còn được tích hợp vào các xe hơi hay tàu chở hàng không người lái trong tương lai gần. Spark có sẵn thư viện machine learning cho riêng mình, gọi là MLib, trong khi đó các hệ thống Hadoop cần tương tác với thư viện machine learning của bên thứ ba, ví dụ như Apache Mahout.

Spark build on Hadoop

Spark build on Hadoop

Nhiều nhà cung cấp lớn như Cloudera bây giờ đã cung cấp Spark cũng như Hadoop. Ví dụ, nếu Big Data của bạn đơn giản chỉ gồm một lượng lớn dữ liệu có cấu trúc (structured data) (chỉ gồm tên và địa chỉ khách hàng), bạn không cần đến kĩ thuật phân tích tiên tiến streaming và machine learning của Spark. Đồng nghĩa bạn sẽ tốn thời gian, và tiền bạc, để cài đặt một lớp tách biệt trên hệ lưu trữ của Hadoop. Spark, mặc dù phát triển một cách nhanh chóng, nhưng vẫn còn trong giai đoạn non trẻ, và cơ sở hạ tầng cùng với bảo mật chưa thật sự tốt.

Các hoạt động của Spark trong cộng đồng mã nguồn mở nhiều hơn Hadoop. Tuy vậy, nhờ những nguyên tắc trong cộng đồng mã nguồn mở mà hai hệ thống này dường như hỗ trợ lẫn nhau để tạo ra những sản phẩm phù hợp hơn với người dùng. Các nhà cung cấp có thể bán cả hai hệ thống này thông qua nhu cầu của khách hàng để cung cấp các dịch vụ hỗ trợ và cài đặt cho hệ thống Big Data của mình.

Tham khảo một số hệ thống Big Data

Hadoop Workflow

Hadoop Workflow

Big Data Pipeline

Big Data Pipeline

Big Data common architecture

Big Data common architecture

Graph analytics pipeline

Graph analytics pipeline

Recommender System Architecture

Recommender System Architecture

Nguồn: http://www.kdnuggets.com/2015/08/big-data-question-hadoop-spark.html

Advertisements

37 thoughts on “Nên chọn Hadoop hay Spark cho hệ thống Big Data

  1. Cảm ơn Anh đã và đang chia sẻ các bài viết trên blog. Các bài viết rất hay và bổ ích. Em cũng là sinh viên đang nghiên cứu về big data và học cách sử dụng Spark lẫn Scala nhưng thời gian đầu em bị “lạc lối” vì nhiều thứ quá nên em không biết bắt đầu từ đâu ? Anh có thể cho em lời khuyên không ạ ? Em xin cảm ơn Anh nhiều lắm

    Số lượt thích

    • Hi Khánh,

      Rất vui vì bạn đã quan tâm đến blog của mình. Bạn có thể tham khảo bài viết này https://ongxuanhong.wordpress.com/2015/10/11/gop-nhat-kinh-nghiem-lam-nghe-data-scientist/

      Hướng tiếp cận của mình là đi từ bài toán thực tế rồi mới lần ngược lại lý thuyết. Do vậy, bước đầu bạn nên đặt ra câu hỏi cho mình và tìm bài tập liên quan để củng cố kiến thức. Ví dụ, bạn đặt câu hỏi lập trình Spark với Scala như thế nào, thay vì đọc sách hay nghiên cứu sâu về hệ thống rất mất thời gian, bạn nên tìm các tutorial hay bài tập nhỏ để thực hành. Qua mỗi lần như vậy, bạn ghi chú và tổng hợp lại kiến thức cho mình, tốt nhất là viết blog chia sẻ.

      Mình nghĩ “tích tiểu thành đại”, ban đầu bạn sẽ cảm thấy hơi đuối để bắt kịp công nghệ, nhưng sau 1-2 tháng kiên trì theo đuổi mọi thứ sẽ trở nên quen thuộc hơn. Khi đó, bạn đọc thêm các sách tham khảo (thường mình search trên Amazon xem mục lục để tìm hiểu thêm các thuật ngữ) sẽ dễ dàng hơn rất nhiều.

      Chúc bạn thành công,

      Liked by 2 people

  2. Hi a,
    E đang chuẩn bị làm dự án về machine learning và đang bắt đầu từ khâu thu thập dữ liệu. A cho e hỏi là với quy mô dữ liệu như thế nào thì mới cần dùng tới Spark, Hadoop? Dữ liệu e lấy chủ yếu từ log của website TMĐT. Nếu ko cần dùng đến những công cụ đó thì có công cụ nào để xử lý đc ạ?
    Rất mong a cho ý kiến. Chúc a sức khoẻ.

    Số lượt thích

    • Hi e,

      Quy mô dữ liệu từ 1-2GB mỗi giờ hay mỗi ngày thì nên dùng đến chúng. Để tránh mất mát thông tin do dữ liệu đi vào quá lớn, em nên sử dụng thêm các hệ NoSQL (mongodb, cassandra, redis,…). Sau đó, lưu lại theo cấu trúc file của Hadoop và dùng Spark để thực thi tính toán.

      Nếu dữ liệu không nhiều, em nên dùng MySQL hay Oracle để lưu trữ dữ liệu của mình. Về thuật toán machine learning, em có thể tìm kiếm các tool dựng sẵn hoặc tự viết lấy thuật toán machine learning để huấn luyện các tham số.

      Số lượt thích

  3. Hi anh
    Em đang muốn xây dựng mô hình big data sử dụng Hadoop kết hợp với Spark. Nhưng em đang không biết là nên sử dụng mô hình như thế nào là phù hợp ạ. Anh có thể chỉ giúp em được không ạ.
    Em cám ơn!

    Số lượt thích

  4. Hi anh,
    Em đã đọc các bài viết bổ ích trên blog của anh, em đang bị mơ hồ, thông qua jdbc:postgresql Spark kết nối tới postgres,cho em hỏi là Spark có làm tăng tốc độ query của postgres không anh ? Em đang làm báo cáo với table có hàng triệu record.
    Em cám ơn!

    Số lượt thích

  5. Hi anh,
    Thực sự các bài viết chia sẻ của anh rất hữu ích. Em mới bắt đầu nghiên cứu mảng Big Data để giải quyết bài toán gặp phải. Vì mới tìm hiểu nên mọi thứ còn rất mông lung, xin được sự góp ý của anh để nghiên cứu.
    Bài toán em xin được ví dụ đơn giản như sau: Hiện tại em đang có nguồn dữ liệu giả sử có 3 bảng:
    – user : gồm id, name, active_date (dữ liệu khoảng vài chục triệu người dùng)
    – recharge_history: id_user, recharge_amount, date_time (date+hour)
    – charge_history: id_user, charge_amount, date_time

    Yêu cầu bài toán là truy xuất liên tục ra thông tin một user bất kỳ gồm đầy đủ các thông tin trên theo id_user để phan tích tính toán cho một bài toán khác.
    Vấn đề gặp phải là với số lượng user rất lớn như vậy và lượng dữ liệu giao dịch tăng cũng rất lớn khiến tốc độ truy xuất rất chậm.
    Em có nghĩ giải pháp với Hadoop hoặc Cassandra…nhưng chưa có một ý tưởng cụ thể nào. Rất mong anh cho em ý kiến.

    Hy vọng nhận được hồi âm của anh.
    Em cảm ơn anh rất nhiều!

    Số lượt thích

    • Hi em, cám ơn em đã quan tâm tới blog.

      Không biết hệ thống của em có nhận dữ liệu đầu vào theo từng giây hay không? Để xác định mình có cần sử dụng đến các công nghệ Streaming (Kafka, Kinesis, Spark Streaming, Apache Storm, Amazon Firehose,…). Anh giả sử bài toán của em là batch processing (không phải stream processing).

      Với tập dữ liệu anh từng làm việc thì hàng chục triệu rows tương đương khoảng 10-30GB.
      Nếu em sử dụng Hadoop + Spark thì em có thể dùng Parquet format để nén dữ liệu xuống gấp 10-15 lần, như vậy em chỉ còn khoảng 1-3GB dữ liệu mỗi lần load (Spark load khá nhanh với kiểu dữ liệu file, khoảng 5-10s). Thêm vào đó, Spark SQL cung cấp đầy đủ các phương thức join, select, where để rút trích thông tin theo yêu cầu với tốc độ cao (do dữ liệu đã được load hết vào RAM, không như các hệ quản trị CSDL khác là dùng index để search table nằm trên đĩa lưu trữ). Đồng thời em có thể cache dữ liệu để sử dụng cho các tác vụ tiếp theo.

      Cassandra anh cũng có thử test qua, có lẽ do chưa hiểu sâu về hệ quản trị này nên với dữ liệu khoảng 500GB (đã có index) dùng câu lệnh đơn giản SELECT count(*) FROM table_name thì khá chậm, thậm chí bị timeout.

      Số lượt thích

      • Em cảm ơn anh,

        Bài toán của em thực ra cụ thể hơn 1 chút thì là thế này. Em có một hệ cơ sở dữ liệu gồm các bảng như trên, khoảng vài chục triệu records hoặc nhiều hơn thế nữa.
        Hệ thống của em cứ mỗi 5 giây sẽ gửi thông tin khoảng 50-100 users, và trong thời gian này em cần phải truy xuất đủ thông tin cần thiết của 100 users trên + analyze. Như vậy, em cần chưa đến 1s để truy xuất đủ thông tin từng đó user vì còn time để thực hiện các tác vụ khác.
        Nói chung em đang tìm hiểu 1 giải pháp làm sao để truy xuất 1 khoảng dữ liệu nhanh nhất có thể.
        Theo như tìm hiểu em thấy Hadoop với Hbase có vẻ sẽ đáp ứng yêu cầu.
        Theo kinh nghiệm của anh thì giải pháp nào là tối ưu nhất ạ.

        Em chân thành cảm ơn anh,

        Số lượt thích

        • “mỗi 5 giây sẽ gửi thông tin khoảng 50-100 users”. Users này mới hay đã tồn tại trong database?

          Nếu em chỉ quan tâm xử lý thông tin user mới thì em có thể sử dụng Kafka + Apache Storm để xử lý dữ liệu và lưu kết quả lại.

          Nếu em quan tâm xử lý thông tin của user đã tồn tại trong database thì việc tìm kiếm thông tin cần được phân tán ra để cho tốc độ tìm kiếm nhanh. Em có thể tạo ra 3 cluster và chỉ định mỗi cluster lưu trữ tên người dùng tương ứng A-G, H-N, M-Z và dùng kĩ thuật binary search để tìm kiếm (sẽ tốn thời gian để sắp xếp lại bảng dữ liệu hiện có).

          HBase được thiết kế để làm việc với hdfs format, vẫn đọc từ đĩa nên không chắc tốc độ sẽ nhanh hơn những hệ NoSQL thông thường (mongodb, cassandra, redis, postgre), em cần thực nghiệm để chọn ra công cụ phù hợp nhất.

          Số lượt thích

  6. Hi a,
    Em hình dung ra thêm được một chút rồi. ^^
    Hiện tại em có sẵn một database có các thông tin (user, recharge, charge,…). User của em ở đây lại lưu theo id là các số như số điện thoại ý ạ (10 số, 11 số), ko theo name, name chỉ là cột dữ liệu thông tin tham khảo.
    Hệ thống chương trình của em cứ mỗi 5 giây là gửi 1 request kiểu: Tao có 100 cái id (số điện thoại ở đây), giờ tao cần lấy thông tin ứng với 100 user đó (đầy đủ các history nạp, tiêu,…) để tính toán..

    Em mới bắt đầu hướng nghiên cứu để giải quyết bài toán nên là khi mà tự mày mò đọc tìm hiểu cảm giác “choáng ngợp” :D.

    EM cũng đã cài đặt Hadoop và chạy thử cái ví dụ wordcount rồi, nhưng thực ra vẫn còn rất mông lung chưa xác định được hướng giải quyết của mình.
    EM cũng có sự so sánh Spark với Hadoop…Thông tintìm kiếm được là Spark có tốc độ xử lý nhanh hơn nhiều.

    Do em hiện tại cũng đang bị hạn chế thời gian nghiên cứu để đưa ra giải pháp cụ thể chính xác nên rất mong đc sự góp ý của anh.

    Em cảm ơn a rất nhiều

    Số lượt thích

    • Vài trò của RDD là phân tán dữ liệu trên bộ nhớ. HDFS là định dạng file giúp lưu trữ phân tán trên ổ cứng. Spark có thể load dữ liệu từ nhiều nguồn như MySQL, MongoDB, file. Trong đó file được lưu trên định dạng đĩa HDFS sẽ có tốc độ đọc cao hơn CSDL truyền thống. Lưu trữ ở đây là trong trường hợp bị ngắt điện thì RDD sẽ bị giải phóng, do đó ta cần lưu dữ liệu trên ổ cứng định dạng là HDFS để có thể đọc lại dữ liệu nếu có xảy ra sự cố mất điện.

      Số lượt thích

  7. Chào anh Hồng,
    Theo như cách hiểu của em hiện tại thì:
    Spark sẽ load dữ liệu từ 1 input storage khác và biến dữ liệu thành RDDs. Dữ liệu sẽ được xử lí trên RAM của các cluster song song với nhau và trả result về. Vậy:
    1. Result này là một set dữ liệu trả về, hay chỉ là signal cho Master biết task đã hoàn thành ? Hay cả là 2 ?
    2. Em có thể transform dữ liệu sang một dạng khác từ dữ liệu đầu vào không ? ví dụ: input vào là Json, sau khi xử lý transform thành PostgreSQL output chẳng hạn.
    3. Nếu có thể transforms như trên thì Spark hỗ trợ những input à output nào?
    4. Cơ chế xử lý và recovery lỗi của Spark như thế nào ạ ?
    Mong anh giải đáp thắc mắc giúp em. Em cảm ơn ạ.

    Số lượt thích

    • Hi em,
      1. Task hoàn thành sẽ trả về cho master nếu hệ thống có nhiều cluster, ngược lại sẽ trả về trực tiếp trên máy đơn.
      2. Được em, nhưng Spark làm việc với RDD hoặc Spark Dataframe/Dataset sẽ hiệu quả hơn.
      3. Bất kỳ input/output nào em nghĩ ra đều có cách xử lý.
      4. Hiện tại anh không thấy Spark có cơ chế recovery, em cần quản lý hệ thống khi phát hiện job bị failed để ta có thể rerun lại process.

      Số lượt thích

  8. Em chưa rõ lắm với câu trả lời của anh.
    1. Task trả về này là bao gồm những gì ? Processed Data or Result report ?
    2. Spark load dữ liệu từ 1 nguồn dữ liệu (vd như Json), sau khi load vào hệ thống của Spark thì dữ liệu JSON này thành được transform thành RDDs. Sau khi người dùng tương tác với RDD xong thì từ RDD này transform output ra thành một dạng cấu trúc dữ liệu khác với Json ban đầu (vd như PostgreSQL). Em hiểu như vậy có đúng không?
    4. Em thấy RDD là Resilent Distributed Dataset, có chỗ dịch là “Set dữ liệu phân tán có khả năng tự phục hồi”. Nếu 1 task của 1 job bị failed thì Spark có tự động re-assign lại task đó cho một node khác không ?
    Em cảm ơn ạ.

    Số lượt thích

    • Hi em,
      1. Processed data sẽ nằm trên các node con, Result data sẽ nằm trên master.
      2. Đúng rồi em, tuỳ mục đích của mình thôi, ở đây rất thoải mái.
      4. Failed ở đây phải hiểu sẽ có 2 trường hợp: một là node con bị failed thì Spark sẽ tự re-assign lại cho các node khác, hai là code em bị failed thì toàn bộ tiến trình sẽ failed và không được assign lại, lúc này em phải handle exception và retry bằng code của em.

      Số lượt thích

  9. Em có hai trường hợp muốn hỏi anh:
    1. Một node chẳng may gặp sự cố và mất dữ liệu trên RAM (không bị hỏng), liệu Spark có load lại partition dữ liệu đã bị mất đó không ? Nếu có thì anh nói qua cơ chế phục hồi giúp em.
    2. Trong một trường hợp khác, một cluster bị hỏng khi đang chạy. Nghĩa là tổng số cluster trên toàn hệ thống giảm đi 1, và dữ liệu cũng không thể load lại trên cluster này. Thì lúc này hệ thống của Spark có crash không ? Hay Spark có cơ chế nào để phân chia lại data trên các cluster còn lại không ?
    Em cảm ơn ạ.

    Số lượt thích

    • 1. Cơ chế thì chỉ có nhóm Spark mới giải thích được, nhưng anh đoán là họ sẽ dùng cơ chế check-sum để quản lý partition trên các cluster. Nếu check không khớp thì sẽ retry.
      2. Tương tự, master sẽ quản lý failure, anh nhớ không lầm là cứ khoảng 2 giây thì nó sẽ ping qua các cluster để check, thằng nào failed thì master sẽ đẩy task qua cho các cluster còn lại.
      Networking thì sẽ do hệ quản trị tài nguyên quyết định. Zookeeper sẽ quản lý các Mesos master, Mesos sẽ quản lý Marathon/Chronos. Từ đây, Mesos sẽ tự quản lý tài nguyên và tác vụ http://www.swisspush.org/assets/images/mesos/mesos-1.png

      Từ thấp lên cao, nếu thằng thấp nhất failed thì sẽ được giao task cho mấy thằng con đồng cấp khác, nếu failed hết thì sẽ retry bao nhiêu lần (do mình config), nếu master failed thì có backup master để tiếp tục, các master đều failed thì thua, system admin phải vào restart hệ thống.

      Số lượt thích

  10. Anh Hồng ơi, em đọc trên document của spark thấy là: Spark xử lí nhanh hơn Hadoop 100 lần nếu sử dụng memory, và nhanh hơn 10 lần nếu sử dụng đĩa cứng. Em tìm hiểu sâu hơn thì biết được Spark nhanh hơn Hadoop 10 lần trên disk là vì Spark giảm thiểu được số lần đọc ghi nên nhanh hơn.
    Vậy Spark giảm số lần đọc ghi trên disk nhờ cái gì anh ? Em nghĩ là nhờ RDD. Nhưng vẫn chưa rõ lắm là RDD có tác dụng gì trong việc xử lí với disk.

    Số lượt thích

    • RDD em cứ nghĩ nó là mảng abstract các đối tượng. Spark sử dụng tới disk là do memory bị thiếu. Anh nghĩ cơ chế ở đây là lưu lại kết quả tạm, sau khi hoàn tất các xử lý nó sẽ tổng hợp lại các kết quả tạm lại để trả về kết quả cuối cùng. Ngoài ra, nhanh hơn hay không là nhờ các kĩ sư bên Spark cải tiến thuật toán tìm kiếm, gom nhóm của mình.

      Số lượt thích

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s