Apache Hadoop hay Hadoop là một software framework hỗ trợ các ứng dụng phân tán dữ liệu chuyên sâu theo một giấy phép miễn phí. Nó cho phép các ứng dụng làm việc với hàng ngàn máy tính tính toán độc lập và petabyte dữ liệu. Hadoop được bắt nguồn từ các bài báo MapReduce của Google và Google File System.
Hadoop chỉ mạnh khi được thiết lập và triển khai trên cụm nhiều máy, tuy nhiên để làm quen với Hadoop thì bạn có thể cà Hadoop Single Node để làm quen với các câu lệnh, cách cấu hình, ... của Hadoop. Các bạn có thể làm theo hướng dẫn sau đây để cài Hadoop Single Node : Hướng dẫn cài đặt Hadoop Single Node
Để có thể chạy một chương trình Java trên Hadoop thì bạn phải build nó thành file jar sau đó chạy file jar đó trên hadoop. Bài viết này mình sẽ hướng dẫn chi tiết về cách build chương trình ra file jar và chạy nó trên Hadoop (mình sẽ chạy ở trên Hadoop Single Node nha, việc chạy trên Hadoop Multi Node với Single Node là như nhau chỉ khác bước cấu hình triển khai các cụm thôi)
Trước hết là mình có một project WordCount tại đây : WordCount project. Các bạn clone project
về trước nha, project là maven project
nên các bạn chỉ cần clone về, import vào IDE mà bạn sử dụng rồi nó sẽ tự cập nhật thư viện cần thiết.
Mình giải thích qua một chút về project này để mọi người hiểu đã nha, WordCount là bài toán tính tần suất xuất hiện của một từ trong một văn bản hoặc một tập văn bản đầu vào, bài toán này là bài toán kinh điển của Hadoop Mapreduce. Project của mình có 2 tham số đầu vào là đường dẫn tới file input và đường dẫn nơi đặt file output.
Trong file pom.xml
mình sẽ cấu hình 2 thư viện hadoop-common
và hadoop-hdfs
.Quan trọng hơn, để build project ra file jar thì bạn phải thêm các dòng sau và giữa 2 thẻ <plugins>
:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <archive> <manifest> <mainClass> com.hadoop.mapreduce.WordCount </mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions>
</plugin>
Trong đó giữa 2 thẻ <mainClass>
phải là đường dẫn tới Class chứa hàm main của bạn (project WordCount
các bạn clone về của mình thì mình đã thêm đầy đủ rồi, các bạn có thể theo dõi trong project và các bạn vừa clone về).
Nếu bạn dùng phiên bản jdk khác jdk-11 thì hãy để ý tới chỗ maven-compiler-plugin
:
Giữa 2 thẻ <release>
hãy thay đổi để phù hợp với phiên bản của bạn. Ví dụ, nếu bạn dùng jdk-15 hãy thay số 11 thành 15. Còn nếu bạn dùng Java 8 thì phức tạp hơn tí. Xóa thẻ <release>
đi và thêm vào giữa 2 thẻ <configuration>
là 2 thẻ sau :
<source>1.8</source> <target>1.8</target>
Tạo file jar với maven
Để build file jar với maven, các bạn mở terminal lên và đi tới thư mục gốc của project đó và chạy lệnh :
mvn clean package
Kết quả của chương trình sẽ ra như sau :
(Hiện chữ BUILD SUCCESS như trên là đã build thành công nha)
Khởi động Hadoop
Dĩ nhiên là để chạy trên Hadoop thì bạn phải khởi động Hadoop trước (làm theo hướng dẫn cài Hadoop Single Node bên trên của mình nha). Sau khi khởi động các bạn chạy lệnh jps
để kiểm tra, nếu đủ 6 deamon như dưới thì là đã khởi động thành công :
(cái org.eclipse....jar kia mình cũng không nên để ý tới nó lắm, để ý 6 cái còn lại thôi)
Chạy file jar WordCount trên Hadoop
Trước khi chạy thì ta phải chuẩn bị dữ liệu đầu vào trước, trong Project mình có để một file input.txt
chúng ta sài đỡ file này làm file đâu vào nha, bây giờ phải đẩy nó lên HDFS bằng câu lệnh sau :
hdfs dfs -copyFromLocal input.txt /
Kiểm tra lại xem đã thành công chưa bằng cách kiểm tra các file và thư mục trong HDFS bằng lệnh :
hdfs dfs -ls /
hoặc bạn cũng có thể xem trực tiếp công cụ UI tại đường dẫn :http://localhost:9870/explorer.html#
Bây giờ, để chạy file jar WordCount thì chạy lệnh sau :
hadoop jar target/wordcount-V1.jar com.hadoop.mapreduce.WordCount hdfs://localhost:9001/input.txt hdfs://localhost:9001/output
Trong đó :
target/wordcount-V1.jar
là đường dẫn tới file jar WordCountcom.hadoop.mapreduce.WordCount
là đường dẫn tới vị tríClass
chứa hàmmain
hdfs://localhost:9001/input.txt
là đường dẫn file đầu vào trong HDFS [1]hdfs://localhost:9001/output
là đường dẫn của thư mục đâu ra [2]
[1] và [2] là 2 tham số mà mình đã chỉ định trong Project, trong các Project của mình các bạn có thể set các tham số tùy thích, có thể bạn fix cứng đầu ra và chỉ nhận 1 tham số đầu vào là input thôi cũng hoàn toàn OK. Còn một điều quan trọng nữa là do mình bị xung đột cổng lên mình có cấu hình Hadoop HDFS của mình tại cổng 9001 (thường là cổng 9000), nên nếu các bạn cấu hình HDFS tại cổng 9000 thì sửa lại đường dẫn bên trên thànhlocalhost:9000
nha
Sau khi chạy xong một thư mục ouput sẽ được sinh ra trên HDFS các bạn có thể truy cập vào http://localhost:9870/explorer.html#
để kiểm tra, kết quả sẽ như sau :
(thi thoảng nó lại sinh thêm thư mục /tmp gì gì đó thì cũng kệ nó nha)
Chạy lệnh sau để kiểm tra kết quả :
hdfs dfs -cat /output/part-r-00000
Kết quả hiển thị sẽ như sau :
Xem toàn bộ mã nguồn tại link github : https://github.com/trannguyenhan/word-count-hadoop
Tham khảo : hadoop.apache.org, tailieubkhn.com