3.1.1. Giới thiệu
Solr là một máy chủ tìm kiếm độc lập với các hàm API giống REST
(Representational State Transfer). Bạn đưa các documents cho nó (để đánh chỉ mục) thông qua XML, JSON hoặc nhị phân bằng HTTP. Và truy vấn thông qua HTTP GET và nhận được các kết quả XML, JSON hoặc nhị phân. Solr sử dụng thư viện tìm kiếm Lucene và mở rộng nó.
3.1.2. Các tính năng chính của Solr:
Khả năng tìm kiếm văn bản toàn diện (Full-Text Search)
Được chỉnh sửa để tối ưu khi lưu lượng tìm kiếm trên server lớn. Sử dụng các chuẩn mở để giao tiếp với các hệ thống khác. Thông qua
XML, JSON và HTTP.
Có giao diện quản lý server trên web toàn diện và dễ sử dụng.
Khả năng mở rộng cao – dễ dàng nhân bản hiệu quả tới các Solr Search Servers khác để cùng xử lý.
Sự mềm dẻo và khả năng chỉnh sửa dễ dàng thông qua cấu hình bằng XML.
Sử dụng kiến trúc Plugin mở rộng, giúp cho việc thêm các chức năng mới dễ dàng hơn.
3.2 Mã nguồn mở Nutch
Nutch là một cài đặt mã nguồn mở của một search engine được Doug Cutting – Người sáng lập của cả Lucene và Hadoop, và Mike Cafarella khởi đầu. Nó cung cấp tất cả công cụ cần thiết để xây dựng một search engine.
3.2.1. Các lý do để tự xây dựng một Search Engine
1. Sự trong suốt. Nutch là mã nguồn mở, vì thế mọi người có thể thấy được cách các thuật toán xếp hạng hoạt động. Với những search engines thương mại, sự chi tiết về thuật toán là bí mật vì thế không thể biết một kết quả tìm kiếm được xếp hạng như thế nào. Hơn thế nữa, một vài search engines cho phép việc xếp hàng dựa trên việc trả tiền. Nutch phù hợp cho việc giảng dạy và các
tổ chức chính phủ, khi mà sự rõ ràng của việc xếp hạng là quan trọng hơn.
2. Sự hiểu biết. Chúng ta không có mã nguồn của Google, vì thế Nutch có lẽ là thứ tốt nhất chúng ta có. Rất thú vị để thấy cách hoạt động của một search engine lớn. Nutch còn thu hút các nhà nghiên cứu muốn thử các thuật toán tìm kiếm mới vì nó rất dễ mở rộng.
3. Sự mở rộng. Không thích cách các search engine khác hiển thị kết quả? Tự viết search engine sử dụng Nutch! Nutch rất mềm dẻo, nó có thể được tùy chỉnh và tích hợp vào trong ứng dụng.
3.2.2. Các tính năng chính của Nutch
Nó cho phép:
1. Thu thập dữ liệu, phân tích và đánh chỉ mục song song và phân tán thông qua việc sử dụng MapReduce và hệ thống file phân tán (Hadoop).
2. Hỗ trợ đánh chỉ mục nhiều loại định dạng: plain text, HTML, XML, ZIP,
OpenDocument (OpenOffice.org), Microsoft Office (Word, Excel, Powerpoint), PDF, JavaScript, RSS, RTF…
3. Sử dụng cơ sở dữ liệu đồ thị liên kết (Link-graph database) để sử dụng trong thuật toán PageRank.
Hình 3.1. Sơ đồ hoạt động của Nutch khi sử dụng như một Crawler
Đầu tiên, có tập URLs khởi tạo, thông qua Injector chuyển nó vào CrawlDB. CrawlDB thông qua Generator sẽ tạo ra một Segment (lúc này trong Segment sẽ có một thư mục crawl_generate chứa các URLs cần thu thập dữ liệu). Fetcher sẽ dùng các URLs trong Segment để thu thập dữ liệu từ các trang web và cập nhật lại Segment (lúc này, Segment sẽ có thêm các dữ liệu thu thập được). Parser sử dụng dữ liệu trong
thêm các URLs mới từ các trang web thu thập được vào trong CrawlDB. Quá trình này sẽ được lặp đi lặp bao nhiêu lần tùy theo việc cấu hình độ sâu cần thu thập trên mỗi trang web.
Hình 3.2. Sơ đồ đầy đủ của Nutch khi sử dụng như một Search Engine
Trong hình trên, dữ liệu thu thập từng phần (Segments) được sử dụng để tạo ra LinkDB (cơ sở dữ liệu chứa các liên kết). Sau đó Indexer sử dụng Segments, LinkDB và CrawlDB để đánh chỉ mục (sử dụng Lucene) tạo ra Index. Segments chứa các dữ liệu đã thu thập được, LinkDB được sử dụng trong thuật toán PageRank lúc đánh chỉ mục và CrawlDB chứa các URLs đã thu thập được. Searcher tìm kiếm các kết quả trong Index để trả về cho giao diện người dùng (Web).
3.3. API biểu đồ Facebook
Trong khuôn khổ luận văn, chương trình được thử nghiệm trên mạng xã hội Facebook. Để có thể truy xuất và thu thập dữ liệu trên Facebook, chúng ta đã được các nhà phát triển cung cấp 1 công cụ tuyệt vời đó là Facebook Graph API.
Trước hết Facebook coi các mối quan giữa các thực thể như là một "Đồ thị xã hội" (Social Graph)
Hình 3.3. Facebook
của Facebook. Đó là một HTTP API dựa trên mức độ thấp mà bạn có thể sử dụng để truy vấn dữ liệu, gửi những câu chuyện mới, tải lên hình ảnh và một loạt các nhiệm vụ khác mà một ứng dụng có thể cần phải làm.
Hình 3.4. Trao đổi qua API
Graph API được đặt tên theo ý tưởng của một "đồ thị xã hội" - một đại diện của các thông tin trên Facebook bao gồm:
node (nút): Một cách cơ bản là những "thứ" người ta sử dụng, một hình ảnh, một trang, một nhận xét trong facebook
edge (cạnh): Là các kết nối giữa những "thứ", chẳng hạn như kết nối giữa hình ảnh và trang chứa ảnh đó, hoặc một ghi chú và bức ảnh được ghi chú đó
field (trường/lĩnh vực): Thông tin về những "thứ", chẳng hạn như ngày sinh nhật của người sử dụng, hoặc tên của một trang.
Graph API là dựa trên HTTP, do đó, làm việc với bất kỳ ngôn ngữ nào có một thư viện HTTP, như cURL, urllib. Chúng tôi sẽ giải thích thêm một chút về những gì bạn có thể làm với điều này trong phần dưới đây, nhưng nó có nghĩa là bạn cũng có thể sử dụng Graph API trực tiếp trong trình duyệt của bạn, ví dụ như gửi một đòi hỏi này tương đương với:
http://graph.facebook.com/facebook/picture?redirect=false
Và nhận được kết quả, nó chứa thông tin về icon của facebook graph. Copy giá trị url có trong kết quả và dán lên trình duyệt bạn sẽ có được icon đó.
{ "data": { "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/t1.0- 1/p50x50/1377580_10152203108461729_809245696_n.png", "is_silhouette": false } }
Với Facebook Graph API, ta có thể truy xuất tìm kiếm tất cả các dữ liệu thống kê có trong các trang mạng xã hội Facebook.
3.4. Solr trên Hadoop và tìm kiếm thử nghiệm 3.4.1. Sơ đồ 3.4.1. Sơ đồ
3.4.1.1. Sơ đồ hoạt động của hệ thống khảo sát
Hình 0.5: Mô hình tổng quan của hệ thống khảo sát
Đầu tiên là Crawler sẽ thực hiện việc dò tìm dữ liệu, cụ thể là các Post và comments nằm rải rác trên các trang mạng xã hội Facebook, tạo thành các Documents dữ liệu đầu vào cho dạng JSON và được đưa tới phân tán tại server của Apache Hadoop, Apache Solr sử dụng các tài liệu trên hệ thống HDFS để thực hiện việc đánh chỉ mục và tìm kiếm. Dữ liệu đầu ra là kết quả tìm kiếm theo từ khóa người dùng, thống kê và trực quan hóa kết quả.
Hệ thống chỉ mục, tìm kiếm từ khóa sẽ trả kết quả về văn bản gốc phù hợp đã được lưu trữ tại hệ thống lưu trữ. Thư viện lập chỉ mục đã được tích hợp sẵn trong
Chuẩn metadata JSON Tài liệu 1 Tài liệu n APACHE HADOOP … HDFS HDFS HTTP FS APACHE SOLR Đánh chỉ mục ngược Bộ tìm kiếm Kết quả truy vấn M ẠN G X Ã H ỘI Crawler Facebook Graph API
3.4.1.2. Sơ đồ giai đoạn đánh chỉ mục
Hình 0.6: Sơ đồ giai đoạn đánh chỉ mục
Các tài liệu được lưu trữ phân tán trên Hadoop được đánh chỉ mục với MapReduce theo mô hình sau:
Hình 0.7: đánh chỉ mục với MapRedece trên Solr
Solr sử dụng chuyển đổi tất cả các bản ghi đầu vào trở thành các cặp <Key- Value> và từ đó tạo thành class SolrInputDocument và sau đó thực hiện đánh chỉ mục hàng loạt. Solr sử dụng một số class được viết sẵn có hỗ trợ MapReduce để thực hiện
Data
Inverted Index Documents
Data Data
Để gọi class MapReduceIndexerTool trong Solr ta làm như sau: $ hadoop jar /opt/cloudera/parcels/CDH/lib/solr/contrib/mr/search-mr-*- job.jar \ org.apache.solr.hadoop.MapReduceIndexerTool \ -D 'mapred.child.java.opts=-Xmx500m' \ --log4j /opt/cloudera/parcels/CDH/share/doc/search*/examples/solr- nrt/log4j.properties \ --morphline-file morphline.conf \ --output-dir hdfs://nameservice1:8020/tmp/outdir \
--verbose --go-live --zk-host localhost:2181/solr
Ngoài ra còn có 1 số class hỗ trợ đánh chỉ mục trong Solr như:
SolrIndexUpdateMapper SolrXMLDocRecordReader SolrIndexUpdater
3.4.1. Cài đặt cụm máy Hadoop
Phần này trình bày cách xây dựng một cụm máy Hadoop hoàn chỉnh với 2 máy trong môi trường ảo hóa. Máy ảo sẽ đóng vai trò là máy khách và máy chính sẽ đóng vai trò máy chủ. Quá trình cài đặt trải qua các bước sau:
Bước 1: Chuẩn bị
Cài đặt java
Hadoop được viết bằng Java, vì vậy để chạy được Hadoop, tại mỗi máy trên cụm đều phải được cài đặt môi trường Java (báo cáo này sử dụng Java phiên bản 1.8) Kiểm tra cài đặt môi trường java bằng câu lệnh như sau:
$ java -version
java version "1.8.0_91"
Java (TM) SE Runtime Environment (build 1.8.0_91-b14) Java HotSpot (TM) 64bit server VM (build 25.91-b14, mixed mode)
Nếu kết quả hiện thị có dạng tương tự như trên thì điều này có nghĩa máy tính đã được cài đặt môi trường Java.
Cài đặt mạng
Hadoop sử dụng IP4 vì vậy sau khi hoàn tất bước 2 (cài đặt Hadoop) ta sẽ thực hiện vô hiệu hóa IP6 khi máy chạy Hadoop. Việc này được thực hiện bằng cách thêm dòng sau vào tệp tin có đường dẫn là /usr/local/hadoop/conf/hadoop-env.sh:
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
khách là 192.168.18.128. Tên của 2 máy này cũng được xác định ở bước này, 2 máy sẽ có tên gọi là MAY_CHU và MAY_KHACH. Mở tệp hosts ở đường dẫn /etc/hosts trên cả 2 máy và thêm 2 dòng sau vào cuối nội dung của tệp:
192.168.18.1 MAY_CHU 192.168.18.128 MAY_KHACH
Người dùng trên các máy
Trên cả 2 máy ta đều sử dụng người dùng có tên là hduser để đơn giản và để tránh việc Hadoop xung đột với các chương trình khác đang chạy trên máy. Việc tạo người dùng hduser trên hệ thống của cả 2 máy được thực hiện như sau:
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser
Cấu hình SSH
Hadoop sử dụng SSH để điều khiển việc chạy các tiến trình trên các máy khách từ máy chủ. Theo cơ chế trên, máy chủ sẽ thực hiện kết nối với các máy khách một cách tự động thông qua qua dịch vụ SSH trên máy khách này. Do vậy, trên mỗi máy khách cần được cài đặt SSH và SSH trên mỗi máy khách này cần được cấu hình để cho phép các tiến trình chạy với quyền của người dùng Hadoop (hduser) có thể đăng nhập vào mà không cần điền mật khẩu. Nếu máy chưa được cài đặt SSH ta phải cài đặt gói OpenSsh cho máy bằng câu lệnh sau:
$ sudo apt-get install openssh-server
Sau khi cài đặt SSH thành công, ta thực hiện cấu hình cho cả 2 máy để cho phép các tiến trình hoạt động dưới quyền hdsuer mà không cần điền mật khẩu:
$ su - hduser
$ ssh-keygen -t rsa -P ""
$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
Trên máy chủ ta thực hiện câu lệnh như sau để ghi đè mật khẩu lên cả máy chủ và máy khách:
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub hduser@MAY_KHACH
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub hduser@MAY_CHU
Sau khi đã cấu hình thành công mật khẩu ta thực hiện kết nối với máy chủ với máy chủ và máy chủ với máy khách như sau:
$ ssh hduser@MAY_CHU
$ ssh hduser@MAY_KHACH
Bước 2: Cài đặt hadoop
Bước này sẽ hướng dẫn cấu hình cụm máy Hadoop với cấu trúc khách – chủ. Máy chủ sẽ đóng 2 vai trò: vai trò điều khiển đông thời với vai trò lưu trữ và thực hiện tác vụ con như một máy khách. Máy khách sẽ đóng vai trò lưu trữ và xử lý tác vụ con.
Ta thực hiện các bước sau trên tất cả các máy:
Tải Hadoop 1.2.0 từ trang chủ của Hadoop về máy, đặt tệp tin cài đặt hadoop vào thư mục ở địa chỉ /usr/local. Ta thực hiện các câu lệnh sau:
$ cd /usr/local
$ sudo tar xzf hadoop-1.2.0.tar.gz $ sudo mv hadoop-1.2.0 hadoop
Mở tệp tin $HOME/.bashrc và thêm các dòng sau vào cuối nội dung của tệp tin ở địa chỉ $HOME/.bashrc:
# Set Hadoop-related environment variables export HADOOP_HOME=/usr/local/hadoop
# Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
# Some convenient aliases and functions for running Hadoop-related commands
unalias fs &> /dev/null alias fs="hadoop fs" unalias hls &> /dev/null alias hls="fs -ls"
# If you have LZO compression enabled in your Hadoop cluster and
# compress job outputs with LZOP (not covered in this tutorial):
# Conveniently inspect an LZOP compressed file from the command
# line; run via: #
# $ lzohead /hdfs/path/to/lzop/compressed/file.lzo #
# Requires installed 'lzop' command. #
lzohead () {
hadoop fs -cat $1 | lzop -dc | head -1000 | less }
# Add Hadoop bin/ directory to PATH export PATH=$PATH:$HADOOP_HOME/bin
Thay đổi biến môi trường Java cho Hadoop bằng cách sửa tệp tin ở đường dẫn /usr/local/hadoop/conf/hadoop-env.sh như sau:
Sửa 2 dòng sau:
# The java implementation to use. Required. # export JAVA_HOME=/usr/lib/j2sdk1.5-sun
# The java implementation to use. Required. export JAVA_HOME=/usr/lib/jvm/java-8-oracle
Cấu hình thư mục trên máy tính mà Hadoop Hadoop sẽ lưu dữ liệu như sau:
$ sudo mkdir -p /app/hadoop/tmp
#...and if you want to tighten up security, chmod from 755 to 750...
$ sudo chmod 750 /app/hadoop/tmp
Thêm các dòng sau đây vào giữa thẻ <configuration>... </configuration> của tệp tin ở đường dẫn /usr/local/hadoop/conf/core-site.xml:
<property>
<name>hadoop.tmp.dir</name> <value>/app/hadoop/tmp</value>
<description>A base for other temporary directories. </description>
</property> <property>
<name>fs.default.name</name>
<value>hdfs://MAY_CHU:54310</value>
<description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem.
</description> </property>
Cấu hình địa chỉ của máy cũng như cổng mà công việc sẽ được thực hiện. Thêm các dòng sau đây vào giữa thẻ <configuration>... </configuration> của tệp tin ở đường dẫn /usr/local/ hadoop/ conf/mapred-site.xml:
<property>
<name>mapred.job.tracker</name> <value>MAY_CHU:54311</value>
<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map
and reduce task.
</description> </property>
Cấu hình số lượng nhân bản mà Hadoop sẽ thực hiện để nhân bản dữ liệu bằng cách thêm các dòng sau vào giữa thẻ <configuration>... </configuration> của tệp tin ở đường dẫn sau
<property>
<name>dfs.replication</name> <value>2</value>
<description>Default block replication. The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description> </property>
Riêng trên máy chủ ta phải cấu hình thêm như sau:
Cấu hình máy sẽ làm nhiệm vụ điều khiển ở đây là máy Chu. Trên máy chủ, ta thêm dòng sau vào tệp tin ở đường dẫn /usr/local/hadoop/conf/masters:
MAY_CHU
Ta cấu hình các máy sẽ làm nhiệm vụ làm việc ở đây cả 2 máy sẽ đóng vai trò làm việc nên ta thêm 2 dòng sau vào cuối tệp tin ở đường dẫn /usr/local/hadoop/conf/slaves.
MAY_CHU MAY_KHACH
Trước khi bắt đầu sử dụng cụm máy Hadop này, ta phải định dạng lại HDFS thông qua máy điều khiển bằng câu lệnh như sau:
$ cd /usr/local/hadoop
$ bin/hadoop namenode -format
Chú ý rằng khi ta thực hiện câu lệnh này, tất cả dữ liệu hiện đang có trên hệ thống dữ liệu HDFS đều bị xóa bỏ.
Bước 3: Khởi động cụm máy Hadoop và kết thúc khi hoàn thành công việc
Quá trình khởi động thực hiện qua 2 bước: Khởi động HDFS và khởi động MapReduce