Hadoop是一个分布式计算平台,不但支持海量数据的存储,同时也提供了可靠的分布式数据处理机制,处理过程被优化为在大量廉价的硬件上扩展。
一、Hadoop环境搭建
为了使用Hadoop,我们需要完成Hadoop的环境搭建,在这里介绍如何搭建Hadoop 2.7.2的环境,详细步骤如下:
1. 安装Java并设置环境变量
cd /opt
tar -zxvf jdk-8u131-linux-x64.tar.gz
vim /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
2. 安装hadoop
cd /opt
tar -zxvf hadoop-2.7.2.tar.gz
vim /etc/profile
export HADOOP_HOME=/opt/hadoop-2.7.2
export PATH=${HADOOP_HOME}/bin:${PATH}
source /etc/profile
3. 修改hadoop配置文件
cd /opt/hadoop-2.7.2/etc/hadoop
vim hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_131
export HADOOP_HOME=/opt/hadoop-2.7.2
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_PREFIX=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
4. 启动Hadoop集群
cd ${HADOOP_HOME}/sbin
./start-dfs.sh
./start-yarn.sh
二、HDFS的使用
在Hadoop中,HDFS将数据拆分成多个块,分布式存储到不同节点上,为了让大文件能够并行处理,HDFS使用了块的概念,一个块可以理解为是一个文件的一部分。
1. HDFS基础操作
# 创建目录
hdfs dfs -mkdir /input
# 在本地创建文件
echo "hello hadoop" > test
# 上传文件到HDFS
hdfs dfs -put test /input
# 查看上传到HDFS的文件
hdfs dfs -ls /input
# 下载文件到本地
hdfs dfs -get /input/test test2
# 删除HDFS上的文件
hdfs dfs -rm /input/test
# 查看HDFS上文件内容
hdfs dfs -cat /input/test2
2. HDFS读写文件
下面是使用Java API读写HDFS文件的示例代码:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.InputStream;
import java.net.URI;
public class HdfsDemo {
private static final String HDFS_PATH = "hdfs://localhost:9000";
private static final Configuration CONF = new Configuration();
public static void main(String[] args) throws Exception {
URI uri = new URI(HDFS_PATH);
FileSystem fs = FileSystem.get(uri, CONF);
// 写入文件
String content = "Hello HDFS!";
byte[] buff = content.getBytes("UTF-8");
InputStream in = new ByteArrayInputStream(buff);
fs.create(new Path("/test.txt"));
IOUtils.copyBytes(in, out, 4096, true);
// 读取文件
InputStream in = fs.open(new Path("/test.txt"));
IOUtils.copyBytes(in, System.out, 4096, false);
fs.close();
}
}
三、MapReduce的使用
MapReduce是Hadoop提供的用于大规模数据处理的编程模型,用户可以编写Map和Reduce函数,让Hadoop分发数据,执行Map任务,然后收集结果,执行Reduce任务,最终将结果返回。
1. MapReduce基础操作
下面是使用命令行执行MapReduce任务的示例命令:
# 创建输入目录并上传数据
hadoop fs -mkdir /input
hadoop fs -put /usr/local/hadoop/LICENSE.txt /input
# 执行MapReduce任务
hadoop jar /usr/local/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
# 查看输出结果
hadoop fs -cat /output/part-r-00000
2. MapReduce自定义函数
下面是编写自定义Map函数的Java代码:
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);
}
}
}
下面是编写自定义Reduce函数的Java代码:
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);
}
}
下面是编写Driver程序来运行自定义MapReduce任务的Java代码:
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]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
四、Hadoop集群管理
在Hadoop中,集群管理分为两个部分:节点管理和作业管理。节点管理是指监控集群中的每个节点,确保它们正常工作。作业管理是指确保MapReduce作业正确提交和管理,监控作业的进度,以及保证数据在节点之间的正确移动。
1. 节点管理
下面是使用命令行监控Hadoop集群节点状态的示例命令:
$HADOOP_HOME/bin/hdfs dfsadmin -report
2. 作业管理
下面是使用命令行提交MapReduce作业的示例命令:
$HADOOP_HOME/bin/hadoop jar /usr/local/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
下面是使用浏览器查看作业运行状态的示例地址:
http://localhost:8088/cluster
五、总结
Hadoop菜鸟教程介绍了Hadoop的环境搭建、HDFS的使用、MapReduce的使用和Hadoop集群管理等方面的内容,这些内容可以帮助初学者快速了解和学习Hadoop的基础知识。