Solr trên Hadoop và tìm kiếm thử nghiệm

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán đánh chỉ mục ngược với mapreduce và ứng dụng trong việc đánh giá ý kiến của học sinh hòa bình trên mạng xã hội​ (Trang 61)

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

Thành phần điều khiển được khởi động trên máy Chu và máy lưu trữ sẽ được khởi động trên cả máy Chu và may LamViec. Chạy tệp tin $HADOOP_HOME/bin/start-dfs.sh trên máy Chu:

$ cd $HADOOP_HOME $ bin/start-dfs.sh

Khởi động MapReduce: Thành phần quản lý công việc con sẽ được khởi động trên máy Chu và thành phần quản lý các tác vụ con được khởi động trên cả máy Chu và máy LamViec. Chạy câu lệnh bin/start-mapred.sh trên máy chủ.

$ cd $HADOOP_HOME $ bin/start-dfs.sh

Trên máy chủ: $ jps 16017 Jps 14799 NameNode 15686 TaskTracker 14880 DataNode 15596 JobTracker 14977 SecondaryNameNode Trên máy khách: $ jps 15183 DataNode 15897 TaskTracker 16284 Jps

Nếu kết quả như trên thì có nghĩa việc cài đặt Hadoop đã hoàn tất. Để tắt Hadoop ta thực hiện câu lệnh sau:

$ cd $HADOOP_HOME $ bin/stop-all.sh

3.4.2. Cài đặt Nutch tích hợp với Solr

Hướng dẫn cài đặt Nutch tích hợp với Solr. Trong báo cáo này ta sử dụng Nutch 1.6 và Solr 4.8.0.

Cài đặt Nutch

 Tải tệp tin apache-nutch-1.6-src.tar.gz từ địa chỉ https://archive.apache.org/dist/nutch/1.6/.

 Giải nén tệp tin và chuyển thư mục tới đường dẫn /usr/local/nutch.

$ tar –xvzf apache-nutch-1.6-src.tar.gz

$ sudo mv apache-nutch-1.6-src /usr/local/nutch

 Đi đến thư mục cài đặt Nutch bằng câu lệnh cd /usr/local/nutch.  Chỉnh sửa tệp tin nutch-default.xml bằng câu lệnh sudo gedit

conf/nutch-default.xml, thêm những dòng sau vào cuối nội dung tệp tin:

<property>

<name>http.agent.name</name> <value>My Nutch Spider</value> </property>

 Chạy câu lệnh:

$ cd /usr/local/nutch $ ant runtime

 Kiểm tra cài đặt Nutch thành công bằng câu lệnh sau

$ cd /usr/local/nutch/runtime/deploy $ bin/nutch

Nếu kết quả có dạng như sau thì có nghĩa việc cài đặt Nutch đã hoàn tất:

Usage: nutch [-core] COMMAND ...

Cài đặt Solr

 Tải về tệp tin solr-4.8.0.tgz từ địa chỉ

https://archive.apache.org/dist/lucene/solr/4.8.0/.

 Giải nén tệp tin và di chuyển tới địa chỉ /usr/local/solr bằng câu lệnh:

$ tar –xvzf solr-4.8.0.tgz

$ sudo mv solr-4.8.0.tgz /usr/local/solr

Hình 0.8: Giao diện làm việc của Solr

 Đi đến thư mục example của Solr và khởi động Solr bằng câu lệnh:

$cd /usr/local/solr/example

$java –jar start.jar

 Sau khi khởi động Solr ta có thể kiểm tra hoàn tất cài đặt Solr bằng cách truy cập trình duyệt web theo đường dẫn sau:

http://localhost:8983/solr/

Tích hợp Solr với Nutch

 Sao chép tệp tin /usr/local/nutch/conf/schema-solr4.xml vào thư mục conf ở đường dẫn /usr/local/solr/example/solr/conf và đổi tên tệp tin thành schema.xml

 Thêm dòng sau vào tệp tin schema.xml sau dòng <field

<field name="_version_" type="long" indexed="true" stored ="true"/>

 Khởi động Solr bằng câu lệnh

$cd /usr/local/solr/example

$java –jar start.jar

 Ta có thể truy cập vào địa chỉ web http://localhost:8983/solr/

3.4.3. Thu thập dữ liệu

Quá trình thu thập dữ liệu được thực hiện trên nền tảng MapReduce của Hadoop, tất cả các bước trong quá trình thu thập dữ liệu đều được thực hiện song song trên tất cả các máy của cụm máy Hadoop. Từng máy sẽ làm các nhiệm vụ thu thập dữ liệu với các URL được phân công sau đó kết quả của quá trình thu thập dữ liệu được trộn lại với nhau bằng hàm rút gọn kết quả (reducer). Các thư mục cuối cùng của quá trình thu thập được lưu lại trên hệ thống lưu trữ phân tán HDFS.

Trước hết, việc thu thập dữ liệu trên Facebook được thực hiện qua Facebook Graph API. Ta có thể truy cập vào Facebook Graph API qua đường link sau:

https://developers.facebook.com/tools/explorer Giao diện hiện lên như hình dưới:

Hình 0.9: Giao diện làm việc của Facebook Graph API

Đăng ký một App trên bộ công cụ phát triển Facebook, ta được cấp 1 Access Token (Là mã cho phép gửi đòi hỏi tới Server. Nếu bạn đang login vào một tài khoản facebook nào đó, giá trị này sẽ được mặc định hiển thị cho tài khoản đó.), sử dụng nó để có thể truy cập vào các trang Fanpage hoặc các trang cá nhân.

Hình 0.10: Access Token của một trình Facebook Graph API

Sau đó ta thực hiện việc lấy thông tin từ các trang Facebook cần dò tìm khảo sát. Với công cụ Facebook Graph API, các lựa chọn tìm kiếm được thể hiện rõ ràng trong hình dưới:

Hình 0.11: Thu thập dữ liệu từ trang mạng của trường THPT Hoàng Văn Thụ

Tất cả các dữ liệu sau khi được Crawler lấy từ Fabook Graph API sẽ được đưa về Hadoop dưới định dạng JSON.

Khởi động Hadoop và Solr:

$ cd $HADOOP_HOME $ bin/start-all.sh $ cd $SOLR_HOME/example

$ java –jar start.jar

bắt đầu thực hiện công việc thu thập dữ liệu bằng các câu lệnh sau:

$ cd /usr/local/nutch/runtime/deploy

$ hadoop –jar apache-nutch-1.6.job

org.apache.nutch.crawl.Crawl thuthap1 –dir data –solr

http://localhost:8983/solr -depth 1

Câu lệnh này sẽ thực hiện thu thập dữ liệu từ trang web và đưa kết quả đên Solr để tạo chỉ mục ngược cho dữ liệu. Sau câu lệnh này cụm máy hadoop bắt đầu thu thập dữ liệu từ địa chỉ có trong nội dung tệp tin seed.txt. Ta có thể theo dõi quá trình thu thập dữ liệu các, công việc đang được tiến hành bằng mapReduce bằng cách truy cập địa chỉ http://localhost:50030/jobtracker.jsp:

Hình 0.12:Giao diên theo dõi quá trình làm việc của MapReduce

Để đọc thông tin trong Crawldb của Nutch ta thực hiện câu lệnh sau:

$ cd $NUTCH_HOME

$ bin/nutch readdb data/crawldb –stats

Quá trình thu thập dữ liệu của trang nhóm học sinh THPT 19-5 Hòa Bình ta có kết quả như sau:

Bảng 0.1: Kết quả thu thập dữ liệu ở 2 chế độ Chiều sâu Chế độ một máy đơn (Standalone) Chế độ phân tán ảo (pseudo distributed) Số URL đã được thu thập 1 137 giây 576 giây 1 2 748 giây 2016 giây 226

3 10264 giây Hơn 10 giờ 4513

Dựa vào bảng ta có thể thấy, với chiều sâu lớn hơn thì thời gian thu thập dữ liệu cũng tăng lên. Điều này là hoàn toàn dễ hiểu khi qua mỗi vòng lặp số URL mà Nutch

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán đánh chỉ mục ngược với mapreduce và ứng dụng trong việc đánh giá ý kiến của học sinh hòa bình trên mạng xã hội​ (Trang 61)

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

(77 trang)