MapReduce khơng phải lúc nào cũng mơ hình tốt nhất

Một phần của tài liệu Đồ án: Mô hình Mapreduce và ứng dụng của Bigdata (Trang 71 - 78)

Trong bản đồ án này, em đã giới thiệu về các ƣu điểm của mơ hình MapReduce. Triên thực tế, thì MapReduce thích hợp cho nhiều bài tốn cần song song hố. Tuy vậy, khơng phải lúc nào MapReduce cũng là giải pháp tốt nhất. Để sử dụng MapReduce thì mỗi mày cần cĩ các hoạt động độc lập với nhau. Nếu các hoạt động cĩ tính dây chuyền thì đây sẽ là khĩ khăn lớn. Vì vậy, cần phải cân nhắc kỹ trƣớc khi áp dụng mơ hình MapReduce vào một thuật tốn nào đĩ.

Chƣơng 4. Cài đặt và thực nghiệm Đồ án tốt nghiệp Đại học

KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN

Những cơng việc mà đồ án đã làm đƣợc

Đồ án đã giới thiệu khái quát đƣợc mơ hình tốn MapReduce bao gồm MapReduce là gì, mơ hình MapReduce, nguyên tắc hoạt động của nĩ. Đồng thời, đồ án cũng giới thiệu một cài đặt của MapReduce là Apache Hadoop, các thành phần, cách thức làm việc, và tìm hiểu một số API cơ bản mà Hadoop cung cấp, cần thiết cho việc lập trình một ứng dụng, hay triển khai một thuật tốn sử dụng mơ hình MapReduce.

Đồ án đƣa ra các ví dụ tiêu biểu cho việc áp dụng mơ hình MapReduce cho ba thuật tốn: k-means, nạve bayes và LDA. Ngồi việc giới thiệu các thuật tốn, đồ án cũng nêu nên các chiến lƣợc khác nhau để áp dụng mơ hình MapReduce vào trong một thuật tốn cụ thể. Từ đĩ đƣa ra giải pháp, cách thức áp dụng mơ hình này.

Sau khi đã cĩ giải pháp áp dụng cho từng thuật tốn, em đã cài đặt các thuật tốn này trên Hadoop chạy trên mơi trƣờng Linux. Đồng thời cũng rút ra so sánh và đánh giá.

Hƣớng nghiên cứu và phát triển đồ án

Em nhận thấy đây là một lĩnh vực tuy khơng cịn mới, nhƣng rất cĩ tiềm năng, và đáng để nghiên cứu sâu hơn. Tuy vậy, trong khuơn khổ của đồ án, với quỹ thời gian và cơ sở vật chất hạn chế nên việc so sánh đánh giá cịn chƣa sâu sắc, chƣa làm nổi bật đƣợc hiệu năng của mơ hình MapReduce đƣợc thực hiện trên mơi trƣờng Hadoop.

Vì vậy trong thời gian tời, em sẽ nghiên cứu kỹ hơn về MapReduce cũng nhƣ các dự án con của hadoop để tìm đƣợc các cơng cụ hữu ích hơn cho việc song song hố các bài tốn thực tế cĩ độ phức tạp cao hơn. Mong rằng cơng cụ cĩ rất nhiều ƣu điểm này sẽ đƣợc phổ biến rộng rãi hơn ở Việt Nam nĩi riêng và trên thế giới nĩi chung.

DANH MỤC TÀI LIỆU THAM KHẢO

[1]. InfoWorld's top 10 emerging enterprise technologies - http://news.idg.no/cw/art.cfm?id=FCC1F3E4-1A64-67EA-E464099B00228D99 [2]. Hồng Văn Dũng, Khai phá dữ liệu web bằng kỹ thuật phân cụm, 2007, Luận văn

thạc sỹ khoa học.

[3]. Jeffrey Dean và Sanjay Ghemawat, MapReduce: Simplified Data Processing on Large Clusters, Google, Inc, 2004.

[4]. David M. Blei, Andrew Y. Ng, Michael I. Jordan, Latent Dirichlet Allocation, Journal of Machine Learning Research 3 (2003) 993-1022

[5]. Cheng-Tao Chu, Sang Kyun Kim, Gary Bradski, Andrew Y. Ng, Kunle Olukotun,

Map-Reduce for Machine Learning on Multicore, Stanford University. [6]. Chuck Lam, Hadoop in Action, 2010

[7]. Tom White, Hadoop: The Definitive Guide, Second Edition, 2011

[8]. William M. Darling, A Theoretical and Practical Implementation Tutorial on Topic Modeling and Gibbs Sampling, School of Computer Science University of Guelph, June 17, 2011

[9]. William Chang, Abijit Bej, Parallelizing LDA using Hadoop Map-Reduce, CSCI 596 Project

[10].Tom Griffiths, Gibbs samppling in the generative model of Latent Dirichlet Allocation, Stanford University.

[11]. Christopher D.Manning, Hinrich Schutze, Foundations Of Statistical Natural Language Processing, 1999

[12]. Ramesh Nallapati, William Cohen, John Lafferty, Parallelized Variational EM for Latent Dirichlet Allocation: An Experimental Evaluation of Speed and Scalability, Carnegie Mellon University.

PHỤ LỤC

PHỤ LỤC 1: Đọc và ghi SequenceFile SequenceFile

Hãy tƣởng tƣợng một logfile, mơi mà mỗi bản ghi nhật kí là một dịng text. Nếu bạn muốn ghi nhật ký kiểu nhị phân, văn bản đơn giản khơng phải là một định dạng phù hợp. lớp SequenceFile của Hadoop phù hợp với luật trong tình huống này, cung cấp một cấu trúc dữ liệu cặp key-value nhị phân. Để sử dụng nĩ nhƣ là một định dạng logfile, bạn cần phải chọn một khĩa, giống nhƣ nhãn thời gian đƣợc biểu diễn bởi LongWriteable, và value là một Writeable đại diện cho số lƣợng đƣợc ghi lại.

SequenceFile cũng làm việc nhƣ là container cho các file nhỏ hơn. HDFS và MapReduce đƣợc tối ƣu cho các file lớn, do đĩ các file đƣợc đĩng gĩi vào trong SequenceFile làm cho việc lƣu trữ và xử lý các tập tin nhỏ hiệu quả hơn.

Ghi SequenceFile

Để tạo một SequenceFile, sử dụng một phƣơng thức tĩnh createWriter(), nĩ trả về một thể hiện của lớp SequenceFile.Writer. Cĩ mootj vài phiên bản đƣợc nạp chồng, nhƣng chúng yêu cầu bạn phải chỉ định một luồng (stream) để ghi vào (hoặc là một FSDataoutputStream hoặc là một FileSystem và Path kết nối), một đối tƣợng Configuration , và kiểu key và value . Các đối số tùy chọn bao gồm các kiểu nén và bộ giải mã, một cuộc gọi lại Progressable đƣợc thơng báo về tiến trình ghi, và một phiên bản của Metadata đƣợc lƣu vào trong header của SequenceFile

Các key và value đƣợc lƣu trong SequenceFile khơng nhất thiết cần phải ở dạng Writable. Bất cứ một kiểu dữ liệu nào kiểu serialized và deserialized của Serialization là cĩ thể sử dụng đƣợc.

Mộ khi bạn cĩ một SequenceFile.Writer, sau đĩ bạn ghi các cặp key-value, bằng các sử dụng phƣơng thức append(). Sau khi bạn hồn thành, bạn gọi phƣơng thức close() (SequenceFile.Writer implements java.io.Closeable)

Ví dụ 1, biểu diễn một chƣơng trình ngắn để ghi một vài cặp key-value vào trong SequenceFile, sử dụng API vừa mơ tả:

import java.io.IOException;

import java.net.URI; //Su dung URI co san cua java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.Text;

public class SequenceFileWriteDemo {

private static final String[] DATA = { "One, two, buckle my shoe",

"Three, four, shut the door", "Five, six, pick up sticks",

"Seven, eight, lay them straight", "Nine, ten, a big fat hen"

};

public static void main(String[] args) throws IOException { String uri = args[0];

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(uri), conf); Path path = new Path(uri);

IntWritable key = new IntWritable(); Text value = new Text();

SequenceFile.Writer writer = null; try {

writer = SequenceFile.createWriter(fs, conf, path, key.getClass(), value.getClass());

for (int i = 0; i < 100; i++) { key.set(100 - i);

value.set(DATA[i % DATA.length]);

System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value); writer.append(key, value); } } finally { IOUtils.closeStream(writer); } } }

Kết quả sau khi chạy:

root@vungoc:/usr/local/hadoop# bin/hadoop jar test.jar SequenceFileWriteDemo numbers.seq

11/06/16 11:06:01 INFO util.NativeCodeLoader: Loaded the native- hadoop library

11/06/16 11:06:01 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library

11/06/16 11:06:01 INFO compress.CodecPool: Got brand-new compressor [128] 100 One, two, buckle my shoe

[173] 99 Three, four, shut the door [220] 98 Five, six, pick up sticks

[264] 97 Seven, eight, lay them straight …

Sau đĩ, để kiếm tra lại bạn sử dụng lệnh:

root@vungoc:/usr/local/hadoop# bin/hadoop fs –lsr để kiểm tra xem đã cĩ file numbers.seq chƣa.

Đọc từ một SequenceFile

Đọc các file sequence từ đầu đến cuối là vấn đề của việc tạo ra một thể hiện của SequenceFile.Reader, và lặp lại nhiều lần bằng cách gọi phƣơng thức next(). Một thứ bạn dùng phụ thuộc vào framework serialization mà bạn sử dụng. Nếu bạn sử dụng kiểu Writeable, bạn cĩ thể sử dụng phƣơng thức next() mà cĩ đối số là một key và một value, và đọc key và value tiếp theo trong stream vào các biến:

public boolean next(Writable key, Writable val)

Nĩ trả về giá trị true nếu cặp key-value đã đƣợc đọc và false nếu đến cuối file. Đối với những cái khác, frameworks serialization khơng phải Writeable (giống nhƣ Apache Thrift), bạn nên sử dụng hai phƣơng thức sau:

public Object next(Object key) throws IOException

public Object getCurrentValue(Object val) throws IOException Trong trƣờng hợp này, bạn cần phải chắc chắn rằng cái serialization mà bạn muốn sử dụng đã đƣợc thiếp lập trong thuộc tính io.serializations;

Nếu phƣơng thức next() trả lại một đối tƣợng khơng null, một cặp key-value đã đƣợc đọc từ stream và value cĩ thể đƣợc lấy bằng cách sử dụng phƣơng thức

getCurrentValue(). Nếu khơng, nếu phƣơng thức next() trả lại null, thì đã kết thúc file.

Chƣơng trình trong Ví dụ 2 cho thấy làm thế nào để đọc một sequence file cĩ các key là Writeable và values . Lƣu ý làm thế nào để biết kiểu key và value từ SequenceFile.Reader thơng qua phƣơng thức gọi getKeyClass() và getValueClass(), sau đĩ ReflectionUtils đƣợc sử dụng để tạo ra một thể hiện cho key và một thể hiện cho value. Bằng cách sử dụng cách này, chƣơng trình cĩ thể đƣợc sử dụng với bất kì sequence file mà là key và value Writeable

Ví dụ 2. Đọc một SequenceFile

public class SequenceFileReadDemo {

public static void main(String[] args) throws IOException { String uri = args[0];

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(uri), conf); Path path = new Path(uri);

SequenceFile.Reader reader = null; try {

reader = new SequenceFile.Reader(fs, path, conf); Writable key = (Writable)

ReflectionUtils.newInstance(reader.getKeyClass(), conf); Writable value = (Writable)

ReflectionUtils.newInstance(reader.getValueClass(), conf); long position = reader.getPosition();

while (reader.next(key, value)) {

String syncSeen = reader.syncSeen() ? "*" : "";

System.out.printf("[%s%s]\t%s\t%s\n", position, syncSeen, key, value);

position = reader.getPosition(); // beginning of next record } } finally { IOUtils.closeStream(reader); } } }

PHỤ LỤC 2: Cấu hình một cụm Hadoop

Sau khi cài đặt OpenSSH và cài đặt cho nĩ, cùng với việc vơ hiệu hố IP V6 và download bản Hadoop 0.21.0 vào thƣ mục /usr/local/ thì chúng ta thực hiện cấu hình cho các file conf nhƣ sau:

i. hadoop-env.sh

Cài đặt JAVA_HOME. Thay đổi

# The java implementation to use. Required. # export JAVA_HOME=/usr/lib/j2sdk1.5-sun Thành :

# The java implementation to use. Required. export JAVA_HOME=/usr/lib/jvm/java-6-sun ii. conf/core-site.xml <!-- In: conf/core-site.xml --> <property> <name>hadoop.tmp.dir</name> <value>/your/path/to/hadoop/tmp/dir/hadoop-${user.name}</value> </property> <property> <name>fs.default.name</name> <value>hdfs://localhost:54310</value> </property> iii. conf/mapred-site.xml <!-- In: conf/mapred-site.xml --> <property> <name>mapred.job.tracker</name> <value>localhost:54311</value> </property> iv. conf/hdfs-site.xml <!-- In: conf/hdfs-site.xml --> <property> <name>dfs.replication</name> <value>1</value>

Một phần của tài liệu Đồ án: Mô hình Mapreduce và ứng dụng của Bigdata (Trang 71 - 78)

Tải bản đầy đủ (PDF)

(78 trang)