ES Hadoop 一台主机的科学普及
近几年,随着大数据技术的发展,Hadoop和Elasticsearch(ES)成为了数据处理和分析中的重要工具。Hadoop主要用于分布式存储和处理大规模数据,而Elasticsearch则是一个强大的搜索引擎,能够实时分析大量信息。将这两个工具结合在一台主机上,可以高效地进行数据的存储、处理和分析。本文将介绍如何在一台主机上使用Hadoop和Elasticsearch,并提供相应的代码示例、流程图和甘特图以帮助理解。
环境准备
首先,你需要准备一台具有相对较高性能的计算机,以及安装好的Java环境。接下来,下载并安装Hadoop和Elasticsearch。以下是安装过程的简要步骤:
# 下载Hadoop
wget
tar -xzvf hadoop-3.3.1.tar.gz
export HADOOP_HOME=~/hadoop-3.3.1
export PATH=$PATH:$HADOOP_HOME/bin
# 下载Elasticsearch
wget
tar -xzvf elasticsearch-7.15.0-darwin-x86_64.tar.gz
cd elasticsearch-7.15.0
./bin/elasticsearch
工作流程
下面是将Hadoop与Elasticsearch集成的基本工作流程:
flowchart TD
A[启动Hadoop] --> B[启动Elasticsearch]
B --> C[将数据上传到Hadoop]
C --> D[使用MapReduce处理数据]
D --> E[将结果导入Elasticsearch]
E --> F[执行搜索查询]
1. 启动Hadoop
使用以下命令启动Hadoop的伪分布式模式:
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
2. 启动Elasticsearch
确保Elasticsearch正在运行,执行以下命令:
cd elasticsearch-7.15.0
./bin/elasticsearch
3. 数据上传到Hadoop
将你的数据集上传到HDFS(Hadoop分布式文件系统):
hdfs dfs -mkdir /data
hdfs dfs -put localdata.txt /data/
4. 使用MapReduce处理数据
编写一个简单的MapReduce程序来处理上传的数据。以下是一个WordCount示例:
import java.io.IOException;
import org.apache.hadoop.conf.Configured;
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;
public class WordCount extends Configured {
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 {
for (String token : value.toString().split("\\s+")) {
word.set(token);
context.write(word, one);
}
}
}
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);
}
}
public static void main(String[] args) throws Exception {
Job job = Job.getInstance();
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]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
在命令行中运行MapReduce任务:
hadoop jar wordcount.jar WordCount /data/localdata.txt /data/output
5. 将结果导入Elasticsearch
使用Elasticsearch Hadoop库将MapReduce的输出结果导入到Elasticsearch中。
es.nodes: "localhost"
es.port: 9200
es.resource: "wordcount/result"
es.input.json: true
在Hadoop的配置文件中添加以上内容。
6. 执行搜索查询
在Elasticsearch中执行查询,确认数据已经成功导入:
curl -X GET "localhost:9200/wordcount/_search?pretty"
项目甘特图
下面是这个项目的执行进度甘特图:
gantt
title Hadoop与Elasticsearch集成
dateFormat YYYY-MM-DD
section 环境准备
安装Hadoop :a1, 2023-10-01, 5d
安装Elasticsearch :after a1 , 5d
section 数据处理
上传数据到Hadoop :2023-10-06 , 2d
运行MapReduce任务 :2023-10-08 , 3d
导入Elasticsearch :after a2 , 2d
section 测试查询
运行搜索查询 :2023-10-12 , 1d
结论
通过在一台主机上结合Hadoop与Elasticsearch,用户能够利用两者的优势进行高效的数据存储和查询。在数据日益增长的当今世界,这样的技术组合将极大地改善数据的处理和分析能力。希望这篇文章能为对Hadoop和Elasticsearch感兴趣的读者提供一个清晰的入门指南,帮助您在实际项目中更好地运用这些技术。