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