TopDev

Apache Hadoop là gì ? cách xây dựng Apache Hadoop và code java với nó

minhdev 📖 6 phút đọc 💬 1 phản hồi

Apache Hadoop là gì?#

Apache Hadoop là một framework mã nguồn mở, được thiết kế để xử lý và lưu trữ lượng dữ liệu cực lớn (Big Data) trên một cụm máy chủ phân tán. Hadoop có thể xử lý dữ liệu một cách hiệu quả bằng cách phân chia công việc và lưu trữ dữ liệu trên nhiều node (máy chủ).



Thành phần chính của Apache Hadoop#

  • Hadoop Distributed File System (HDFS): Hệ thống lưu trữ dữ liệu phân tán, chịu trách nhiệm chia nhỏ dữ liệu thành các khối (blocks) và phân phối chúng trên nhiều máy chủ.

    • Cung cấp tính năng chịu lỗi và đảm bảo dữ liệu vẫn khả dụng khi một số máy chủ gặp sự cố.
  • MapReduce: Một mô hình lập trình để xử lý dữ liệu lớn song song.

    • Gồm hai giai đoạn: Map: Chia nhỏ và xử lý dữ liệu thành các cặp key-value.

      • Reduce: Tóm tắt và tổng hợp dữ liệu đã được xử lý.
  • YARN (Yet Another Resource Negotiator): Quản lý tài nguyên hệ thống và lên lịch cho các ứng dụng Hadoop.

  • Hadoop Common: Bộ thư viện và tiện ích cần thiết để các module khác hoạt động.



Ưu điểm của Apache Hadoop#

  • Khả năng mở rộng: Hoạt động trên hàng ngàn máy chủ.

  • Chi phí thấp: Sử dụng phần cứng phổ thông thay vì các máy chủ cao cấp.

  • Chịu lỗi: Tự động sao lưu dữ liệu và chuyển đổi khi gặp lỗi.

  • Hiệu suất cao: Xử lý dữ liệu song song giúp giảm thời gian xử lý.



Cách xây dựng Apache Hadoop#

1. Yêu cầu hệ thống

  • Phần cứng: Tối thiểu 8GB RAM và CPU 4 lõi cho mỗi node.

    • Dung lượng ổ cứng lớn, phụ thuộc vào dữ liệu cần xử lý.
  • Phần mềm: Hệ điều hành: Linux (thường là Ubuntu hoặc CentOS).

    • Java JDK: Hadoop yêu cầu Java 8 hoặc cao hơn.

2. Các bước cài đặt

a. Chuẩn bị môi trường

  • Cài đặt Java: sudo apt update sudo apt install openjdk-11-jdk -y java -version

  • Tạo người dùng Hadoop: sudo adduser hadoop sudo usermod -aG sudo hadoop

  • Cấu hình SSH: Tạo SSH Key: ssh-keygen -t rsa

    • Thêm public key vào authorized_keys để truy cập mà không cần mật khẩu: cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys

b. Tải và cài đặt Hadoop

  • Tải Apache Hadoop: Tải phiên bản ổn định từ trang chính thức: Apache Hadoop Releases. wget https://downloads.apache.org/hadoop/common/hadoop-<version>/hadoop-<version>.tar.gz

  • Giải nén và cài đặt: tar -xzvf hadoop-<version>.tar.gz sudo mv hadoop-<version> /usr/local/hadoop

  • Cấu hình biến môi trường: Thêm vào ~/.bashrc: export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

    • Áp dụng thay đổi: source ~/.bashrc

c. Cấu hình Hadoop

  • Cấu hình core-site.xml: Tệp: $HADOOP_HOME/etc/hadoop/core-site.xml `

    fs.defaultFS hdfs://localhost:9000 `
  • Cấu hình hdfs-site.xml: Tệp: $HADOOP_HOME/etc/hadoop/hdfs-site.xml `

    dfs.replication 1 `
  • Cấu hình mapred-site.xml: Tệp: $HADOOP_HOME/etc/hadoop/mapred-site.xml `

    mapreduce.framework.name yarn `
  • Cấu hình yarn-site.xml: Tệp: $HADOOP_HOME/etc/hadoop/yarn-site.xml `

    yarn.nodemanager.aux-services mapreduce_shuffle `

d. Định dạng HDFS và khởi động Hadoop

  • Định dạng HDFS: hdfs namenode -format

  • Khởi động dịch vụ Hadoop: start-dfs.sh start-yarn.sh

  • Kiểm tra trạng thái: Truy cập web UI: Namenode: http://localhost:9870

    • Resource Manager: http://localhost:8088


Thực hành thêm#

  • Chạy thử các lệnh HDFS: hdfs dfs -mkdir /user hdfs dfs -mkdir /user/hadoop hdfs dfs -put input.txt /user/hadoop hdfs dfs -ls /user/hadoop

  • Viết và chạy một chương trình MapReduce đơn giản.

1 phản hồi

  1. minhdev #1

    Để xây dựng một chương trình Java sử dụng Apache Hadoop, bạn có thể viết một ứng dụng đơn giản với mô hình MapReduce. Dưới đây là một ví dụ minh họa với bài toán đếm số lần xuất hiện của từng từ trong một tệp văn bản.



    Bước 1: Chuẩn bị môi trường#

    • Cài đặt Apache Hadoop và Java Development Kit (JDK).

    • Thêm thư viện Hadoop vào dự án Java: Nếu bạn sử dụng Maven, thêm dependency vào tệp pom.xml: `

      org.apache.hadoop hadoop-common 3.3.6 org.apache.hadoop hadoop-mapreduce-client-core 3.3.6 `


    Bước 2: Viết code MapReduce#

    Cấu trúc chương trình

    Chương trình sẽ gồm 3 phần chính:

    • Mapper: Chia nhỏ dữ liệu và tạo các cặp key-value.

    • Reducer: Tổng hợp dữ liệu từ Mapper.

    • Driver: Thiết lập và khởi chạy job MapReduce.

    Mã nguồn Java

    ` import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

    import java.io.IOException; import java.util.StringTokenizer;

    public class WordCount {

    // Mapper Class
    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
    
        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one); // Emit key-value pair: (word, 1)
            }
        }
    }
    
    // Reducer Class
    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
    
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result); // Emit key-value pair: (word, total_count)
        }
    }
    
    // Driver Class
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
    
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
    
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
    
        FileInputFormat.addInputPath(job, new Path(args[0])); // Input file path
        FileOutputFormat.setOutputPath(job, new Path(args[1])); // Output file path
    
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
    

    } `



    Bước 3: Biên dịch và chạy chương trình#

    1. Biên dịch mã nguồn

    • Đảm bảo rằng bạn đã thêm các thư viện Hadoop vào CLASSPATH nếu không dùng Maven.

    • Biên dịch mã nguồn: javac -classpath $(hadoop classpath) -d . WordCount.java

    • Tạo tệp JAR: jar -cvf WordCount.jar -C . .

    2. Chuẩn bị dữ liệu đầu vào

    • Tạo một tệp văn bản mẫu (input.txt): hadoop is a framework hadoop is open source hadoop handles big data

    • Tải tệp vào HDFS: hdfs dfs -mkdir /input hdfs dfs -put input.txt /input/

    3. Chạy ứng dụng MapReduce

    • Chạy chương trình với lệnh sau: hadoop jar WordCount.jar WordCount /input /output

    • Kiểm tra kết quả trong HDFS: hdfs dfs -cat /output/part-r-00000

      Kết quả (ví dụ): a 1 big 1 data 1 framework 1 handles 1 hadoop 3 is 2 open 1 source 1



    Bước 4: Phân tích và cải thiện#

    • Cải tiến Mapper và Reducer: Loại bỏ ký tự đặc biệt.

      • Chuyển tất cả từ về chữ thường để tránh lỗi phân biệt chữ hoa và chữ thường.
    • Kết hợp Combiner: Giảm tải cho Reducer bằng cách tổng hợp trước dữ liệu tại Mapper.

    • Thêm Logs: Sử dụng System.out.println hoặc LOG để debug khi xử lý dữ liệu lớn.



    Nếu cần hướng dẫn thêm hoặc giải thích chi tiết, hãy cho tôi biết! 😊

Bài liên quan trong #Java

✓ Đã sao chép link