Lập chỉ mục nghịch đảo (invertedindex) và tìm kiếm trên tập tài liệu lớnSử dụng Hadoop và Mapreducegiả lập 1 máy tính, hệ điều hành Linux (bản phân phối Ubuntu 16.04, RAM 5GB, ổ cứng 50GB).Vận dụng được mô hình MapReduce vào bài toán đơn giản.Hoàn thành phạm vi bài toán đặt ra: lập chỉ mục nghịch đảo và tìm kiếm trên chỉ mục.Do điều kiện chạy thử nghiệm còn nhiều hạn chế nên chưa phát huy được ưu điểm của mô hình lập trình MapReduce.
Trang 1Lập chỉ mục nghịch đảo
và tìm kiếm trên tập tài
liệu lớn
TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
Lớp cao học - HTTT-K24
Trang 3Line 1: term1 doc1.txt doc2.txt …
Line 2: term2 doc2.txt doc5.txt …
Trang 41 PHẠM VI THỰC HIỆN
nghịch đảo theo mô hình MapReduce
(duyệt qua tất cả nội dung chỉ mục, không áp dụng kỹ thuật tìm kiếm nào để tăng tốc độ).
Cấu trúc lưu trữ kết quả tìm kiếm: tìm thấy từ nào thì hiển thị từ đó cùng với danh sách docID chứa từ đã tìm kiếm
<Term_1> [tab] <docID> [space] <docID> …
<Term_2> [tab] <docID> [space] <docID> …
Trang 52.1 Inverted Index (tổng quát)
Tokenizer
Linguistic modules
Indexer
Inverted index.
friend roman countryman
2 4
2
13 16 1
Documents to
Indexer
Trang 62.1 Inverted Index: áp dụng cho bài toán
Tokenizer (term, docID)
Sort by term
Inverted Index (Dictionary and
Postings)
Trang 72.1 Indexer steps: Tokenizer
I did enact Julius
Caesar I was killed
i' the Capitol;
Brutus killed me.
Doc 1
So let it be with Caesar The noble Brutus hath told you Caesar was ambitious
Doc 2
Trang 82.1 Indexer steps: Sort
Trang 92.1 Indexer steps: Dictionary & Postings
Trang 102.1 Inverted Index - MapReduce
Tokenizer (term, docID) Sort by term
Inverted Index (Dictionary and
Postings)
Input, Splitting
Trang 112.1 Inverted Index – MapReduce: Mô hình
orange black red
yellow orange
red orange blue
red, Doc1.txt orange, Doc1.txt blue, Doc1.txt
yellow blue
orange black red
red orange blue
red, Doc1.txt red, Doc2.txt
orange, Doc1.txt orange, Doc2.txt orange, Doc2.txt
yellow, Doc1.txt yellow, Doc2.txt
blue, Doc1.txt blue, Doc1.txt black, Doc2.txt
red, Doc1.txt Doc2.txt orange, Doc1.txt Doc2.txt blue, Doc1.txt
yellow, Doc1.txt Doc2.txt
black, Doc2.txt
yellow orange yellow, Doc2.txtorange, Doc2.txt
black, Doc2.txt blue, Doc1.txt orange, Doc1.txt Doc2.txt red, Doc1.txt Doc2.txt yellow, Doc1.txt Doc2.txt
Input files Spliting Mapping Shuffling Reducing Result
(Key, Value) (Key, Value) (Key, Value) (Default 128MB/ split)
Trang 122.1 Inverted Index – MapReduce: Map
Map( k1 : id of row in the file ,
v1 : a line of text in the file ){
Trang 132.1 Inverted Index – MapReduce: Reduce
Reduce( k2 : the word ,
v2[] : list of docID with the same k2 ){
Trang 142.2 Search - MapReduce
Tokenizer (term /query , listdocID),
term query and index
Sort by term /query
//Query: xử lý thêm
Write results (term /query , listdocID)
Index files Query file
Input, Splitting
Trang 152.2 Search – MapReduce: Map
Map( k1 : id of row in the index file ,
v1 : a line of text in the index file ){
Trang 162.2 Search – MapReduce: Reduce
Reduce( k2 : the word ,
v2[] : list of docID with the same k2,
but this case v2 has one element ){
// nếu k2 là query thì cần xử lý thêm
emit( k3 : the word ~ k2 , v3 : list docID ); }
Trang 172.3 Inverted Index – Java code: Mapper class
public class InvertedIndexMapper extends Mapper <LongWritable, Text , Text, Text >{
private Text docID = new Text();
private Text word = new Text();
public void map( LongWritable key, Text value , Context context
) throws IOException, InterruptedException {
FileSplit file = (FileSplit) context.getInputSplit();
Trang 182.3 Inverted Index – Java code: Reducer class
public class InvertedIndexReducer
extends Reducer<Text,Text , Text,Text > {
String listdocID=new String();
public void reduce(Text key, Iterable<Text> values, Context
context) throws IOException, InterruptedException {
listdocID=""; //clear du lieu truoc khi ham map duoc goi lap lai
for(Text docID : values) {
if(!listdocID.contains(docID.toString())) //delete Duplicate
if(listdocID.trim().length() > 0){
listdocID = listdocID + " " + docID;
}else listdocID = listdocID + docID;
Trang 192.3 Inverted Index – Java code: Driver class
public class InvertedIndexDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Inverted Index");
job.setJarByClass(InvertedIndexDriver.class);//class contains main function
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//thiet lap so reducer
job.setNumReduceTasks(2); System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Trang 202.3 Search – Java code: Mapper class
public class SearchMapper extends Mapper<LongWritable, Text , Text, Text > {
String [] fields;
String query="";
String[] index;
//code read query: code nay dat ngoai ham map de tranh lap lai nhieu lan khi Mapper goi lai ham map
public void setup(Context context) {
Configuration conf = context.getConfiguration();
String queryPath = conf.get("queryPath");
String lineQuery=null;
//read contents of query file
try {
Path path = new Path(queryPath);
FileSystem fileSystem = FileSystem.get(new Configuration());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileSystem.open(path)));
while ((lineQuery = bufferedReader.readLine()) != null) {
Trang 212.3 Search – Java code: Mapper class
public void map ( LongWritable key, Text value , Context context ) throws IOException, InterruptedException {
index = value.toString().split("\t"); //Tach tung dong chi muc
for (String field : fields) {
Trang 222.3 Search – Java code: Reducer class
public class SearchReducer extends Reducer<Text,Text, Text,Text > {
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
//ban chat mot key duoc gom ve cung mot reducer ma chi muc thi da nhom lai theo key roi
//nen o day chi co duy nhat mot dong gom key, value tuong ung nen ko can phai nhom lai nua
//emit ~ Output(k2: word, v3: listdocID)
for(Text docIDs : values){
context.write(key, new Text("\t"+docIDs));
}
}//end reduce
}//end SearchReducer
Trang 232.3 Search – Java code: Driver class
public class SearchDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 3) { System.err.println("args include: <intput-path> <output-path> <query-path>"); System.exit(2);
}
String queryPath=otherArgs[2];//lay duong dan chuoi query conf.set("queryPath", queryPath);
Job job = Job.getInstance(conf, "Search Engine");
job.setJarByClass( SearchDriver.class );//class contains main function job.setMapperClass( SearchMapper.class );
job.setCombinerClass( SearchReducer.class );
job.setReducerClass( SearchReducer.class );
job.setOutputKeyClass(Text.class);//type data of key ~ key's output type of reduce job.setOutputValueClass(Text.class);//type data of value ~ value's output type of reduce
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Trang 243 Demo chương trình
Đề mô trực tiếp:
+ Số lượng: 7 files (~19 kB)
+ Định dạng: plain text (.txt).
Thiết bị: giả lập 1 máy tính, hệ điều hành Linux (bản
phân phối Ubuntu 16.04, RAM 5GB, ổ cứng 50GB).
Trang 254 KẾT LUẬN
toán đơn giản.
Hoàn thành phạm vi bài toán đặt ra: lập chỉ mục nghịch đảo và tìm kiếm trên chỉ mục.
chế nên chưa phát huy được ưu điểm của mô hình lập trình MapReduce.
Trang 275 TÀI LIỆU THAM KHẢO
[1] Thang Le Dinh, Thuong-Cang Phan, “Towards an Architecture for Big Data Driven Knowledge Management Systems,” AMCIS 2016.
[2] J Dean and S Ghemawat, “MapReduce: Simplified Data Processing on Large Clusters,” in Proceedings of the 6th Conference on Symposium on
Opearting Systems Design & Implementation - Volume 6, CA, USA, 2004, pp 137–150.
[4]
https://stackoverflow.com/questions/47223444/inverted-index-with-mapreduce
Trang 286 HƯỚNG DẪN THỰC HÀNH
Trang 29LOGO