Hadoop, HBase and Zookeeper at Tamtay

5,010 views
4,851 views

Published on

A long presentation in Vietnamese about how to apply HBase and Hadoop at Tamtay social network.

Published in: Technology
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,010
On SlideShare
0
From Embeds
0
Number of Embeds
373
Actions
Shares
0
Downloads
0
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide
  • Tínhtoánphântán: tínhtoán song songtrênnhiềumáy.Reliable: độ tin cậycủahệthống.Scalable: khảnăngmởrộnghệthốngkhikhốilượngcôngviệctănglên, chịutảicaohơn. Vídụxemáylàkhông scalable, tàuhỏalà scalable.
  • HDFS tạoranhiềubảnsaocủatừngkhốidữliệuvàphântánđicácmáycài Hadoop tronghệthống
  • ACID: bốn thuộc tính quan trọng của một hệ quản trị cơ sở dữ liệu khi xử lý bất kỳ giao dịch nào
  • Hadoop, HBase and Zookeeper at Tamtay

    1. 1. &<br />son.bui@tamtay.vn<br />May, 2011<br />
    2. 2. Hadoop làgì<br />Là 1 dựán Open Source!<br />Phụcvụchoviệctínhtoánphântán.<br />Đảmbảotính reliable & scalable.<br />Tínhtoánphântán?<br />Reliable?<br />Scalable?<br />
    3. 3. Ai dùng Hadoop<br />Facebook<br />Ning<br />Last.fm<br />Linkedin<br />Twitter<br />Yahoo<br />Google<br />… Tamtay<br />
    4. 4. Thànhphầncủa Hadoop<br />Thànhphần:<br />Hadoop Distributed File System (HDFS)<br />Hadoop MapReduce<br />Cácdựánliênquan<br />Avro<br />Cassandra<br />Chukwa<br />HBase database<br />Hive data warehouse<br />Mahout<br />Pig<br />ZooKeeper coordination service<br />
    5. 5. Thànhphầncủa Hadoop<br />Thànhphần:<br />Hadoop Distributed File System (HDFS)<br />Hadoop MapReduce<br />Cácdựánliênquan<br />Avro<br />Cassandra<br />Chukwa<br />HBase database<br />Hive data warehouse<br />Mahout<br />Pig<br />ZooKeepercoordination service<br />
    6. 6. HDFS<br />Hệthốnglưutrữ file phântántrênnền Hadoop<br />Phântán: tin cậy & nhanh?<br />Tươngtác: <br />Shell<br />Java API<br />
    7. 7. Kiếntrúc HDFS<br />Master – Slaves<br />Master: Namenode<br />Slaves: Datanodes<br />
    8. 8. HDFS Admin<br />
    9. 9. Thànhphầncủa Hadoop<br />Thànhphần:<br />Hadoop Distributed File System (HDFS)<br />Hadoop MapReduce<br />Cácdựánliênquan<br />Avro<br />Cassandra<br />Chukwa<br />HBase database<br />Hive data warehouse<br />Mahout<br />Pig<br />ZooKeepercoordination service<br />
    10. 10. Tínhtoántuầntựvs song song<br />Tuầntự: việcsauphụthuộcviệctrước<br />Sinh con<br />Tìm partner<br />xxx<br />Cóbầu<br />Sinh con<br />Tínhsố Fibonacci<br />F(n) = F(n-1) + F(n-2)<br />
    11. 11. Tínhtoántuầntựvs song song<br />Song song: thựchiệnđồngthời, khôngphụthuộcvàonhau.<br />Tàunhanh<br />Có n toa<br />Lên & xuốngtàu: cóthể song songở n toa. Toa x khôngphụthuộcvàotoa y, z …<br />Tínhsố Pi = 3.141…<br />Ac = pi * r2 => pi = Ac / r2<br />As = 4r2 => r2 = As / 4<br />pi = 4 * Ac / As<br />
    12. 12. Map Reduce Algorithm<br />Cónhiềuphươngpháp song songhóa<br />Map-Reduce là 1 phươngpháp.<br />Có 1 lớpcácgiảithuậtcóthể song songhóabằng Map-Reduce (khôngphảitấtcả!)<br />Rấtđơngiản: chỉbaogồm 2 hàm<br />Map(input_key, input_value) => {output_key, output_value}<br />Reduce(input_key, input_values[]) => output<br />
    13. 13. Map Reduce Algorithm<br />
    14. 14. Hadoop Map Reduce<br />programming model and software framework dànhchocácứngdụngxửlý song songkhốilượngcựclớndữliệulưutrữtrênhệthốngphântán.<br /> (input) <k1, v1> => map=> <k2, v2> <br /> => combine=> <br /> <k2, v2s> => reduce=> <k3, v3> (output) <br />Data Structure & Algorithm<br />Cấutrúcdữliệu: phântán<br />Thuậttoán: cóthể song songhóa<br />
    15. 15. Google Word Count<br />Cho n vănbản – nội dung trang web<br />Đếmtầnsốxuấthiệncủatừngtừcótrong n vănbản.<br />Vídụ<br />Input<br />Vb1 = Hello World Bye World<br />Vb2 = Hello Hadoop Goodbye Hadoop<br />Output<br />Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2 <br />
    16. 16. Google Word Count<br />MAP<br />map(vb1, “Hello World Bye World”)<br /><Hello, 1><br /><World, 1><br /><Bye, 1><br /><World, 1><br />map(vb2, “Hello Hadoop Goodbye Hadoop”)<br /><Hello, 1><br /><Hadoop, 1><br /><Goodbye, 1><br /><Hadoop, 1><br />
    17. 17. Google Word Count<br />COMBINE<br /><Bye, [1]><br /><Goodbye, [1]><br /><Hadoop, [1, 1]><br /><Hello, [1, 1]><br /><World, [1, 1]><br />
    18. 18. Google Word Count<br />REDUCE<br />reduce(word, values){<br />count = 0;<br />foreach(value in values)<br /> count++;<br />return <word, count>;<br />}<br />reduce(“Hello”,[1, 1]) => <Hello, 2><br />
    19. 19. Thànhphầncủa Hadoop<br />Thànhphần:<br />Hadoop Distributed File System (HDFS)<br />Hadoop MapReduce<br />Cácdựánliênquan<br />Avro<br />Cassandra<br />Chukwa<br />HBase database<br />Hive data warehouse<br />Mahout<br />Pig<br />ZooKeepercoordination service<br />
    20. 20. NoSQL<br />Là 1 lớpcácHệquảntrịcơsởdữliệu (DBMS) cókhácbiệtcơbảnvớiHệquảntrịcơsởdữliệuquanhệ (RDBMS)<br />Khôngcó schema cốđịnh<br />Khôngcó JOIN<br />Khôngcóquanhệ<br />Scale horizontally: pháttriểntheochiềungang<br />
    21. 21. NoSQL<br />ACID<br />Atomic: hoặctấtcảhoặckhônggìcả<br />Consistency: tạoratrạngtháimớihợplệhoặctrởlạinguyêntrạng.<br />Isolation: sựtáchbiệtgiữa 2 giaodịch<br />Durability: bềnvững – lỗikhôngmấtdữliệu<br />CAP Theorem (Brewer's theorem) chocáchệphântán: khôngmộthệphântánnàođảmbảođượccả 3 điềukiệnsau<br />Consistency<br />Availability<br />Partition tolerance<br />
    22. 22. NoSQL<br />Key-Value store<br />Document databases<br />Column oriented databases<br />BigTable<br />Hbase (CA, not P)<br />Cassandra: Key-Value & Column oriented (AP, not C)<br />
    23. 23. HBase Architecture<br />
    24. 24. HBase Architecture<br />Zookeeper: lưutrữ metadata & region info v.v…<br />Master: điềuphối<br />Region Server: Lưutrữdữliệu<br />Mỗi table baogồmnhiều regions. Mỗi region nằmtrên 1 Region Server.<br />Mỗi region baogồm 1 dãyliêntiếpcácrowkey. <br />Mỗikhikíchthướccủa 1 region tăngquá 1 giátrịcụthể, nótựđộng split làm 2 region <br />
    25. 25. HBase table<br />RDBMS table<br />
    26. 26. HBase table<br />Row (rowkey): gồmnhiều family<br />Handle hàngtỉdòng.<br />Family: tậphợpcác column.<br />Column: cộtnằmtrong 1 family<br />Sốlượng column trong 1 family: khácnhautùytừngdòng, từ 0 đếnhàngtriệu<br />Mỗi column cónhiều version (theothờigian) (hàngnghìn versions)<br />Mộtphầntửtrongcơsởdữliệu:<br />rowkey_family_column_timestamp<br />Tấtcảrowkey & dữliệulưutrữdướidạngmảng byte (byte[]).<br />Sắpxếptheothứtựtừđiển (1, 10, 2, 3…)<br />
    27. 27. Student - Course<br />Student<br />1 Student ~ họcnhiều Course<br />Course<br />1 Course ~ cónhiều Student<br />
    28. 28. Student - Course<br />RDBMS<br />
    29. 29. Student - Course<br />HBase Schema<br />
    30. 30. Hbase at Tamtay<br />
    31. 31.
    32. 32.
    33. 33.
    34. 34. Friend module<br />Testimonial: NULL<br />Time<br />SELECT * FROM Users INNER JOIN Friends WHERE …<br />
    35. 35. Friend Module<br />Khôngcần timestamp, bảnthânmỗi column đãcó timestamp<br />Chỉlưu testimonial nếucó<br />Khôngphải join bảng<br />Tìmbạnchung (mutual friend): Map-Reduce<br />
    36. 36. Feed<br />Log<br />User_feed: 130.000.000 dòng<br />
    37. 37. Feed<br />Log:<br />ReversedTimeStamp= MaxLong – Timestamp<br />Sắpxếp log giảmdầntheothờigian<br />Data family: mỗiloại log có 1 cấutrúcdữliệukhácnhau. Số column trong Data family làkhácnhau ở mỗidòng.<br />
    38. 38. Feed<br />User_feed<br />Sốdòng = số user<br />Một column, nhiều versions.<br />Mỗidata family cóthamsố TTL<br />Timestamp < Now() – TTL => xóa<br />Khôngphântrang!<br />
    39. 39. Feed<br />Sinh feed: Map-Reduce (again!!!)<br />Map(logID, logData){<br />uid = logData->getUid();<br />friends = getFriend(uid);<br />foreach (friend in friends)<br /> output(friend, logID);<br />}<br />Reduce(uid, logIDs){<br />foreach(logID in logIDs){<br /> timestamp = extract_timestamp(logID);<br />insert_to_user_feed(uid, logID, timestamp);<br /> }<br />}<br />
    40. 40. Nhượcđiểm<br />Truyvấn 1 dòngdữliệuchậmhơn so với MySQL<br />Xửlýcáccâulệnhsắpxếp (nếukhôngphảitheokhóa)<br />Filter & tìmkiếmtheogiátrị?<br />Design table: ít flexible, phảibiếttrướccácyêucầukhithiếtkế.<br />Vídụ: “Bạnthân”<br />
    41. 41. Ưuđiểm<br />Dễdàngmởrộng, scale up<br />Khảnăngđọc / ghi song songtốt:<br />10 threads cùngđọc 10000 dòngdữliệungẫunhiêntừ 1 bảng 1 triệuphầntử<br />3 servers<br />Nhanhhơn > 2 lần so với MySQL<br />Handle khốilượnglớndữliệu.<br />Dữliệuđượcsaochépđinhiềumáy.<br />Dùng Map-Reduce xửlýcáclệnhthốngkê<br />
    42. 42. Vấnđề<br />Xửlývấnđề Split region?<br />Quánhiều region – khôngtốt<br />1 region: càngkhôngtốt!<br />Đọc – ghiliêntiếp ở 1 region<br />Coding.<br />
    43. 43. Thànhphầncủa Hadoop<br />Thànhphần:<br />Hadoop Distributed File System (HDFS)<br />Hadoop MapReduce<br />Cácdựánliênquan<br />Avro<br />Cassandra<br />Chukwa<br />HBase database<br />Hive data warehouse<br />Mahout<br />Pig<br />ZooKeepercoordination service<br />
    44. 44. Zookeeper<br />Tínhtoánphântánnhư 1 sởthú<br />Trừviệc 2 cáimáytính k thểđẻracáithứ 3!<br />Thêmthiếtbịvàohệthống<br />Phụchồihệthốngsaulỗi<br />Thayđổicấuhình<br />Cânbằngtải<br />v.v…<br />Zookeeper: A high-performance coordination service for distributed applications. <br />
    45. 45. Coordination service<br />Partial failure: lỗiđặctrưngcủatínhtoánphântán: <br />Máy A gửi tin đếnmáy B<br />Khôngthấyphảnhồi<br />Liệugói tin đãđến B?<br />B đãxửlý hay chưa?<br />Dữliệutrảvềtừ B bịlỗi?<br />Coordination service: khônggiúploạibỏ Partial failure, dùngđểxửlýkhigặp Partial failure<br />
    46. 46. Zookeeper Architecture<br />Lưutrữdữliệutrong Memory<br />Snapshot trên ổ cứng<br />Quytắc 2k+1<br />
    47. 47. Zookeeper Architecture<br />Cóthểxemlàhệthống file cótính availability cao.<br />Cấutrúccâygiốngcâythưmục(znode)<br />Mỗiznodevừalà file (chứadữliệu) vừalàthưmục (códanhsáchznode con)<br />ephemeral znode<br />Node chỉtồntạikhi thread tạoranócònkếtnốiđến Zookeeper.<br />persistent znode<br />Tồntạiđếnkhicólệnhxóa.<br />
    48. 48. Ứngdụng<br />Danhsách server:<br />1 ứngdụngphântánchạytrên 1 cụm server<br />Các server cóvaitrònhưnhau.<br />Cầnlưutrữdanhsáchđịachỉcác server<br />Khôngthểlưutrữdanhsáchnàytrên 1 server.<br />Lúcnàothì 1 server “chết” đểloạirakhỏidanhsách?<br />
    49. 49. Ứngdụng<br />Zookeeper:<br />Tạo node “/server_list” - persistent <br />Trênmỗi server, chạy 1 thread kếtnốiđến zookeeper<br />Tạo node “/server_list/tên_server” - ephemeral <br />Giữkếtnốitừ thread đến zookeeper<br />Liệtkê: lấydanhsáchznode con của “/server_list”<br />1 server mấtkếtnối => ephemeral node tươngứngbịxóa<br />
    50. 50. Version<br />Mỗiznodecólưuthông tin version.<br />Mỗikhicóthayđổivớiznode (sửa, xóa, tạomới) version thayđổi<br />Tính Atomic: nếu version lúcđọcvàghikhôngkhớp => exception.<br />
    51. 51. Ứngdụng<br />Atomic sequence: znode“/counter” chứagiátrịsốnguyên<br />Không atomic: <br />A = đọcgiátrịcủa “/counter”<br />A++<br />Ghi A vào “/counter”<br />=> 2 process đọccùng 1 giátrị A!<br />Atomic:<br />do {<br /><A, version> = đọcgiátrị & version của “/counter”;<br />A++;<br />ok = Ghi A vào “/counter” vớithamsố version<br />/* nếu version trùngvới version hiệntạicủa “/counter” return true, nếu version khác version hiệntại, return false */<br />} while (not ok)<br />
    52. 52. Watches<br />Watches chophép client nhậnthôngbáotừ zookeeper nếu 1 znodenàođóthayđổitrạngthái.<br />Interface Watcher<br />public void process(WatchedEvent event)<br />Hàm process sẽđượcgọikhiznodeđượctheodõithayđổitrạngthái<br />Theo dõi 1 znode<br />Cáchàmtươngtácvới zookeeper đềucóthamsốlà 1 class implements Watcher<br />Vídụ:<br />A = new Watcher();<br />Zookeeper.getData(<tên node>, A);<br />Mỗikhi <tên node> thayđổithìA.processsẽđượcthựcthi<br />
    53. 53. Ứngdụng<br />Tựđộngcậpnhậtcấuhình<br />Vớimỗihệphântánnóiriênghoặc 1 cụm server nóichungthìviệcđồngbộcấuhìnhlàquantrọng.<br />100 máy: thayđổicả ở 100!<br />Chảlẽlạilàmbằngtay?<br />Zookeeper?<br />Hjx, máynàođãthay, máynàochưanhỉ?<br />
    54. 54. Ứngdụng<br />Configuration service<br />Thayđổithông tin cấuhình ở 1 máy, cácmáykhácsẽtựthayđổi<br />Giảsửcấuhìnhchỉgồmdạng <key,value><br />znode “/key” chứa value tươngứng.<br />Cậpnhậtcấuhình:<br />Đơngiản.<br />
    55. 55. Ứngdụng<br />Theo dõi & cậpnhậtcấuhình:<br />Class A implements Watcher{<br />void process(Event e){<br /> if (e.nodeDataChange){<br /> value = zookeeper.read(“/key”, this)<br /> //Tiếptụctheodõiznode“/key”;<br />cậpnhật local configdựavào value<br /> }<br /> }<br />}<br />
    56. 56. Ứngdụng<br />main(){<br />a = new A();<br />dump = zookeeper.exist(“/”, a);<br />sleep(forever); //đingủ, đợiđếnlúcznode “/” cóthayđổisẽđượcgọidậytừhàm process của a<br />}<br />Watch sẽđượckíchhoạtcảkhiznode con củaznodeđóthayđổi<br />Chạy main() trênmỗimáycầncậpnhậtconfig.<br />
    57. 57. Future study<br />Hive<br />Dataware house: là database nhưngđượcthiếtkếphụcvụphântích & báocáo<br />SửdụngHiveQL<br />Mụcđích: <br />Đểphântích & tổnghợpdữliệuđượclưutrữmộtcáchcócấutrúctrêncác file củahệthống HDFS<br />Sửdụng Map-Reduce<br />Hive sẽ convert HiveQL sang Map-Reduce code => dễhiểu, tiếtkiệmthờigian & côngsứclậptrình<br />Xửlý log!!!<br />

    ×