Amazon Kinesis Streams là gì

AWS Kinesis
AWS Kinesis

Thông thường, khi thiết kế một hệ thống streaming, ta nghĩ ngay đến bộ công cụ (Kafka, Storm, Redis) để nhận, xử lý, và lưu trữ dữ liệu. Tuy nhiên, khi sử dụng Kafka (một message queue giúp đảm bảo lượng dữ liệu khổng lồ ập đến không bị tắc nghẽn) bạn phải nghiên cứu khá nhiều công nghệ cũng như hiệu chỉnh các thiết lập, thậm chí phải viết code để tối ưu hoá hệ thống của mình. Tương tự như Kafka, Kinesis mặc dù có throughput (tốc độ đọc/ghi) không nhanh bằng nhưng lại giảm đáng kể công việc cho admin system cũng như các developer trong khâu bắn (put) dữ liệu và đọc dữ liệu từ stream.

Trong bài viết này, tôi sẽ trình bày một số thách thức trong xử lý stream cũng như các hướng tiếp cận để giải quyết. Đồng thời cũng giới thiệu sơ qua Kinesis, các tính năng và các thông số cơ bản của hệ thống cùng với các lệnh tương tác với Kinesis stream.

Xem tiếp

Ý nghĩa của việc học

Universal
Universal

Tôi xin dành ra mục này để tổng hợp lại những phát biểu nói lên ý nghĩa của việc học. Từ đó, hy vọng chúng ta sẽ có thêm động lực để trao dồi thêm nhiều kiến thức và thực hiện nghiên cứu hằng ngày.

work hard
work hard

Được đi học chắc chắn là đỡ cực nhọc hơn rất nhiều so với việc “kiếm sống”. Quan trọng hơn, khi có kiến thức, bạn mới cảm thấy “cuộc sống này có nhiều điều tốt đẹp” và “đáng sống”.

Một nghề thì sống đống nghề thì chết.

thinker vs doer
thinker vs doer

Xã hội không dùng được kiến thức trong đầu chúng ta, chỉ khi nào ta biến kiến thức đó thành sản phẩm dùng được thì khi đó kiến thức mới thực sự có giá trị.

Học mà không hành thì học vô ích, hành mà không học thì hành không trôi chảy

Tự học là thuộc tính của trí tuệ gắn liền với bản năng sinh tồn

Stupid vs Smart
Stupid vs Smart

Tri thức tự nó là sức mạnh

Người thích tự học thường có lối sống theo lý tính hơn là sống theo cảm tính vốn thường gắn liền với các bản năng; họ nhận ra được cái giá trị của đời sống tinh thần.

Người trí thì vui, người nhân từ thì sống lâu.

Ai có khả năng tự học thường tự tin, tri túc và tự trọng.

Người tự học vì nhu cầu trí tuệ biết tự đánh giá mình nên tự chủ, dễ nhận ra rằng “càng học càng thấy mình dốt” cho nên thường khiêm tốn.

Kẻ nào không phấn phát tìm hiểu thì ta không giảng cho, không ráng lên để phát biểu ý kiến thì ta không khai phát cho, ta nêu ra một góc cạnh (của vấn đề) mà không tự suy nghĩ tìm ra ba góc kia, thì ta không dạy cho nữa. Cần trở nên năng động , sáng tạo , không ỷ lại, không phụ thuộc vào người khác

The research cycle
The research cycle

Tự học là một công việc gian khổ , đòi hỏi lòng quyết tâm và sự kiên trì .Càng cố gắng tự học con người càng trau dồi được nhân cách và tri thức của mình .Chính vì vậy tự học là một việc làm độc lập gian khổ mà không ai có thể học hộ ,học giúp. Bù lại, phần thưởng của tự học thật xứng đáng : đó là niềm vui, niềm hạnh phúc khi ta chiếm lĩnh được tri thức. Biết bao những con người nhờ tự học mà tên tuổi của họ được tạc vào lịch sử

Học tập những trải nghiệm từ sách để trở thành một người vững vàng, có tầm hiểu biết và dễ dàng vượt qua những thử thách trong cuộc sống tương lai, khi đã bước vào tuổi trưởng thành.

be patient
be patient

Có thể bạn đi sau, đi chậm hơn bạn bè nhưng không sao cả, quan trọng là cái đích bạn hướng tới. Can đảm lên bạn nhé

Bạn vẫn còn tương lai đang rộng mở ở phía trước, ánh mắt cha mẹ đang mong ngóng thành công của chính bạn và cho cuộc sống của đất nước sau này.

Machine Learning cho người bắt đầu

start here
start here

Những bạn yêu thích Machine Learning và không biết mình nên bắt đầu từ đâu có thể bắt đầu tại đây. Mọi câu hỏi, các bạn có thể comment bên dưới, mình luôn sẵn sàng ở đây để hỗ trợ.

Khởi động

Bạn cần làm quen với một vài điểm cơ bản để bắt đầu cuộc hành trình của mình.

Machine learning là gì

Tại sao cần Machine learning

Machine Learning trên Quora hỏi gì đáp nấy

Những ứng dụng thương mại của Deep learning

Các công ty Startup về Deep learning

Kĩ năng phân tích dữ liệu

Bạn cần học và thực hành tiến trình áp dụng machine learning vào bài toán cụ thể. Chuẩn bị dữ liệu > Huấn luyện > Đánh giá và lựa chọn mô hình.

Cách xác định bài toán trong Machine Learning

Kỹ năng làm việc với Machine Learning

Tiền xử lý dữ liệu (Horse Colic dataset)

Getting and cleaning data: Các phương pháp lấy mẫu (Sampling)

Lấy và làm sạch dữ liệu: Xử lý dữ liệu ngoại lai (Outliers)

Feature engineering là gì

Đánh giá mô hình (Model evaluation)

Kỹ năng hệ thống

Bạn cũng nên chuẩn bị cho mình phương pháp quản lý dự án và thao tác nhanh với hệ thống.

Git notes

Command line thường dùng

Các thuật toán cơ bản

Đây là bước mà mọi người thích thú nhất đó là huấn luyện cho máy tính hiểu dữ liệu để đưa ra những dự đoán hữu ích.

Điểm qua các thuật toán Machine Learning hiện đại

Gom nhóm (Clustering analysis) tập dữ liệu Labor

Áp dụng các phương pháp phân lớp (Classification) trên tập dữ liệu Mushroom

Cài đặt Neural Network với Python

Scikit-learn: Naive Bayes Classifier

AdaBoost hỏi gì đáp nấy

C4.5 hỏi gì đáp nấy

Expectation maximization (EM) hỏi gì đáp nấy

Support vector machine (SVM) hỏi gì đáp nấy

Khai thác tập phổ biến (frequent itemsets) với thuật toán Apriori

Tham khảo thêm

Góp nhặt kinh nghiệm làm nghề Data scientist

Xử lý ngôn ngữ tự nhiên (Natural Language Processing) là gì?

Những dự án Machine Learning tập dợt khi rảnh rỗi

5 Machine Learning APIs tốt nhất dành cho Data Science

OpenTable xây dựng hệ thống recommender như thế nào

Xây dựng hệ thống khuyến nghị (Recommendation Engine) cho New York Times

The data science project lifecycle

Biased vs Unbiased: Debunking Statistical Myths 

14 Timeless Reference Books 

Why I Ditched My Fitbit and What This Means for Analytics 

Performance From Various Predictive Models  +

How to Use Cohort Data to Analyze User Behavior 

How to produce sounds in Python, R, Java, C, Perl, Javascript or ev…

What Types of Questions Can Data Science Answer? 

Apache Spark and R : The best of both worlds. 

7 Cases Where Big Data Isn’t Better 

Learn the Concept of linearity in Regression Models 

How to Represent Data with Intelligent Use of the Coordinate System 

The Death of the Statistical Tests of Hypotheses 

Scikit-Learn Tutorial Series 

Implementation of 17 classification algorithms in R 

Top 10 Machine Learning Algorithms 

Machine Learning Algorithm Identifies Tweets Sent Under the Influen…

43 New External Machine Learning Resources and Updated Articles 

How to Tell a Compelling Story with Data – 6 Rules & 6 Tools 

Top 10 videos

Spark – Bước đầu lập trình

Working with RDD
Working with RDD

Ở bài viết trước, ta đã tìm hiểu về Spark SQL, API giúp ta có thể làm việc với MapReduce một cách dễ dàng bằng cách sử dụng ngôn ngữ SQL truyền thống. Spark SQL được kế thừa và tối ưu lại từ kiểu dữ liệu RDD. Do vậy, trong một vài trường hợp ta khó có thể sử dụng đến Spark SQL, ta vẫn có thể sử dụng các hàm trong RDD để làm việc trực tiếp với MapReduce. Qua bài viết này, tôi xin giới thiệu một vài đặc điểm thú vị của RDD các bạn cần lưu ý để có thể làm việc hiệu quả trên kiểu dữ liệu này.

Parallelized Collections

Đây là cơ chế quan trọng trong Spark. Từ một mảng dữ liệu bất kỳ, ta có thể tách mảng dữ liệu này ra thành nhiều phần (partitions/slices), sau đó phân phối (distribute) ra các máy trạm (cluster/slave/node) để chia tải, cuối cùng dữ liệu sẽ được tổng hợp lại tại máy chủ (master/driver). Thông thường ta sẽ cần từ 2-4 partitions cho mỗi CPU ở các máy trạm. Ta dùng hàm parallelize để phân phối dữ liệu.


val data = Array(1, 2, 3, 4, 5, 6)
val distData = sc.parallelize(data) // auto split data
val distData2 = sc.parallelize(data, 2) // split data into 2 partitions

Ví dụ, ta dùng hàm textFile để đọc dữ liệu từ HDFS (block size mỗi file mặc định là 64MB). Khi đó, Spark mặc định sẽ tạo ra một partition tương ứng cho từng block file lấy từ HDFS. Lưu ý, partitions >= blocks.

Spark tự động theo dõi cache được sử dụng tại mỗi node và sẽ loại bỏ dữ liệu của partition nào ít dùng nhất (LRU – least recently used). Ta có thể loại bỏ bằng tay dữ liệu RDD bằng hàm unpersist().

Broadcast variables v được tạo ra bằng cách gọi hàm SparkContext.broadcast(v). Broadcast variable là một wrapper xung quanh biến v, giá trị của biến này có thể được truy xuất thông qua hàm value.


val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar.value

Lỗi hay mắc phải

Lẫn lộn chế độ standalone với cluster mode. Ta hãy xem ví dụ bên dưới: tính tổng các giá trị của mảng data.


var counter = 0
var rdd = sc.parallelize(data)

// Mắc lỗi tại đây (counter khác nhau giữa master và các cluster)
rdd.foreach(x => counter += x)

println("Sum value: " + counter)

Thông thường ta sẽ làm như trên nhưng bạn cần lưu ý khi chạy ở chế độ cluster, lúc này dữ liệu không còn nằm trên master nữa mà được phân phối trên các cluster. Ta cần sử dụng Accumulators như ví dụ bên dưới.


val accum = sc.accumulator(0, "My Accumulator")

sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)

accum.value
res2: Int = 10

RDD Operations

RDDs hỗ trợ 2 phép toán chủ yếu: transformations, tạo ra dataset mới từ dataset ban đầu, và actions, trả dữ liệu về driver (master) program sau khi chạy một loạt các phép biến đổi trên dataset.

Tất cả transformations trong Spark đều hoạt động theo cơ chế lazy, nghĩa là các phép biến đổi này sẽ không được thực hiện cho đến khi phép toán action cần thực thi để trả về cho driver program. Nhờ vậy mà Spark chạy hiệu quả hơn, mỗi lần gọi hàm map(), Spark sẽ distribute dữ liệu ra các cluster và chỉ thực hiện actions khi cần reduce() kết quả về cho driver program. Ngoài ra, ta có thể cache dữ liệu  (trên đĩa, hay trên bộ nhớ phân tán trên nhiều nodes/cluster) cho việc truy xuất nhanh các tính toán tiếp theo.

Vậy nên chọn Storage Level nào?

Spark’s storage levels cho ta lựa chọn đánh đổi (trade-offs) giữa việc sử dụng bộ nhớ và CPU. Ta nên thử qua các option bên dưới để chọn ra được option phù hợp nhất cho hệ thống của mình.

  • Nếu dữ liệu RDDs của bạn có thể nằm gọn trong default storage level (MEMORY_ONLY), ta không cần chỉnh sử gì thêm. Option này sẽ giúp CPU hoạt động hiệu quả hơn khi có thể truy xuất dữ liệu RDD nhanh nhất có thể.
  • Tiếp đến MEMORY_ONLY_SER, SER ở đây là  serialization. Ta cần kết hợp sử dụng cùng với các library fast serialization để các object sinh ra được lưu vào bộ nhớ một cách tiết kiệm nhất nhưng vẫn cho phép truy xuất các đối tượng này có thể chấp nhận được.
  • Không nên lựa chọn cấu hình sử dụng tới ổ cứng, vì việc tính toán partition để lưu tạm dữ liệu cũng như truy xuất ổ cứng rất chậm và tốn kém, trừ khi dữ liệu của bạn quá lớn và bạn không còn lựa chọn nào khác. Bạn có thể nâng cấp RAM để hạn chế sử dụng đến ổ cứng.
  • Ta có thể sử dụng replicated storage levels nếu bạn muốn thông tin luôn sẵn sàng trường hợp một trong các cluster bị die. Tất cả storage levels đều cho phép tính toán lại dữ liệu bị mất, nhưng replicated cho phép bạn tiếp tục các tác vụ đang chạy mà không cần phải đợi để tính toán lại các partition bị mất mát dữ liệu.
  • Trong các môi trường mà việc sử dụng bộ nhớ nhiều hay nhiều ứng dụng hoạt động trên đó, thì chế độ OFF_HEAP mang lại cho bạn một số lợi ích sau:
    • Cho phép nhiều executors share cùng pool of memory trong Tachyon.
    • Giảm đáng kể chi phí garbage collection.
    • Cached data sẽ không bị mất nếu một trong các executors bị crash.

Nguồn tham khảo:

http://spark.apache.org/docs/latest/programming-guide.html

Spark Streaming là gì

ezTrade
ezTrade

Bạn đã bao giờ quan sát một phiên giao dịch chứng khoán vào mỗi buổi sáng (dịch vụ FPT Stock). Đã bao giờ tự hỏi ứng dụng Sentiment Analysis lấy dữ liệu từ Twitter hoạt động real-time như thế nào để giúp cho các marketer hay các chính trị gia đoán biết về xu hướng quan tâm của xã hội, từ đó họ có thể đưa ra được những chiến dịch phù hợp một cách kịp thời nhất. Hay mỗi lần vào siêu thị mua đồ ăn và quan sát thấy hàng dãy quầy thu ngân bấm mã vạch để lưu thông tin hoá đơn mua hàng của hàng trăm khách hàng mỗi giờ. Và còn nữa những giao dịch mà dữ liệu luôn phát sinh theo hàng giờ, phút, giây như tin nhắn gửi về server Facebook, giao dịch ngân hàng, tuyến bay trong hàng không, real-time bidding, thông tin sensor gửi từ các thiết bị wearable hay xe hơi như Uber,…

Vậy những thông tin đổ vào như thác nước này được lưu lại như thế nào? Các hệ quản trị cơ sở dữ liệu hiện tại dường như đã quá tải. Vì vậy, cộng đồng khoa học và các kĩ sư đã cùng nhau phát triển ra các hệ thống như NoSQL (Postegre, MongoDB, Casandra, Redis,…), Message queue (Kafka, Kinesis, Flume, …) để giải quyết thử thách trên. Trong bài viết này, tôi chủ yếu tổng hợp lại những thông tin quan trọng cần nắm bắt về Spark Streaming API, một thư viện hữu ích được dùng để tích hợp trong các hệ thống xử lý streaming.

Xem tiếp