文章目录
Hadoop基础
(一)概述
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。Hadoop的框架最核心的设计就是:HDFS和MapReduce,HDFS为海量的数据提供了存储,MapReduce为海量的数据提供了计算。
Hadoop的发行版除了有Apache hadoop外还有Cloudera版本(CDH),Hortonworks(HDP),DKhadoop等都提供了自己的商业版本。
(二)搭建Hadoop
1. 前提环境
- 必须安装Java环境:我们在linux上先卸载openjdk,下载安装jdk1.8.rpm包;
- 如果要使用可选的启动和停止脚本,则必须安装ssh且sshd必须正在运行以使用管理远程Hadoop守护程序的Hadoop脚本。
2. 下载安装
- 下载地址:Hadoop官网
- 解压安装:
tar zxf hadoop-3.2.1.tar.gz
这里做一个软连接便于操作ln -s hadoop-3.2.1 hadoop
,进入hadoop目录:
- 配置hadoop的JAVA_HOME:
查看本地jdk1.8的路径:rpm -ql jdk1.8 | less
,复制路径
进入hadoop的vim hadoop-env.sh
编辑里:
- 启动hadoop,为了方便查看,我们将hadoop的bin目录路径直接加载到
.bash_profile
配置文件中,再执行source .bash_profile
使它生效:
现在就可以在任何位置直接通过hadoop
命令,查看hadoop!
(三)Hadoop的独立操作
查找并显示给定正则表达式的每个匹配项,输出被写入给定的输出目录。
$ mkdir input 创建一个输入目录
$ cp hadoop/etc/hadoop/*.xml input 拷贝hadoop目录下的.xml文件
$ hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
(四)Hadoop的伪分布式
即在一台机器上实现集群。
1. 编写配置
vim /etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
vim /etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name> dfs.replication </name>
<value> 1 </value>
</property>
</configuration>
2. 设置无密码SSH
ssh-keygen
生成公密钥对
在.ssh目录下会生成两个文件:id_rsa 、id_rsa.pub
ssh-copy-id localhost
将公钥拷贝至localhost实现免密登录!
3. 启动分布式文件系统
- 在终端操作
- 格式化文件系统:
hdfs namenode -format
- 启动NameNode守护程序和DataNode守护程序:
sbin/start-dfs.sh
- 查看服务的端口号:
netstat -antlp
,默认9870为分布式文件系统的web接口 - 访问9870端口:
- 设置作业所需的HDFS目录
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/chs
- 将输入文件复制到分布式文件系统中
在ssh登录状态下操作,hdfs dfs -put input
但此时权限受控:直接在web页面进行图形化操作是不被允许的!
注意:此时在机器上操作已经被连接到分布式文件系统中,和本地没有关系了!不会在本地生成output文件!
例如:再次执行$ hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
查看网页:
直接查看文件:hdfs dfs -cat output/*
将输出文件从分布式文件系统复制到本地文件系统并检查它们:hdfs dfs -get output
查看:
完成后,使用以下命令停止守护进程:sbin/stop-dfs.sh
- 授权后在分布式文件系统web页面操作
配置文件:vim /etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name> dfs.permissions </name>
<value>false</value>
</property>
</configuration>
重启分布式,发现权限已经设置成功!可以在网页上直接操作:可以直接删除
(五)示例: WordCount v1.0
1. 解压安装IDEA
tar zxf ideaIU-2019.3.4.tar.gz -C /opt/
运行脚本:/opt/idea-IU-193.6911.18/bin/idea.sh
为了防止下次无法正常打开 IDEA: 设置一下环境变量:vim ~/.bashrc
添加如下内容: export DISPLAY=:0.0 退出之后,执行,source ~/.bashrc
;
2. 创建maven项目
导入相关的依赖和jar包:
3. 测试代码
import java.io.IOException;
import java.util.StringTokenizer;
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;
public class WordCount {
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);
}
}
}
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 {
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);
}
}
(1)在idea项目生成output文件
在idea项目中编写一个.txt测试文件,并指定输出:
运行程序:生成output目录,可以查看统计的次数:
(2)在分布式文件系统管理生成output文件
首先上传新建的.txt文件到分布式文件系统:hdfs dfs -put test.txt
,再在项目的resources目录中导入hadoop的配置文件:hdfs-site.xml
和 core-site.xml
:
下载分布文件系统output文件到本地 hdfs dfs -get output
,查看结果:
//下篇再见…谢谢