步骤8
Hadoop伪分布式部署配置
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
NameNode:namenode
- 一是管理文件系统文件的元数据信息(包括文件名称、大小、位置、属性、创建时间、修改时间等等),
- 二是维护文件到块的对应关系和块到节点的对应关系,
- 三是维护用户对文件的操作信息(文件的增删改查)与任务调度
DataNode:存放数据 Hadoop 的配置文件位于 $HADOOP_HOME/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错
格式化dfs:指令:bin/hadoop namenode -format
格式化成功,并且状态码为0,说明配置成功
注意:一这个bin/hadoop namenode -format
只能执行一次,不能执行多次,如果多次,出错,就是namedode产生的id和datanote的id不能匹配了
Hadoop伪分布式部署配置
启动hadoop:./sbin/start-dfs.sh
可以在服务器的本地访问hadoop内容,也可以在外部访问。
访问:localhost:50070
步骤9
利用正则表达式匹配示例(grep)测试
问题:如果出现以下问题:
怎么办呢?别着急执行如下指令:
export HADOOP_ROOT_LOGGER=DEBUG,console
好了,又又可以执行了。
OK,如果你没有DEBUG的内容,不要着急,这是因为你的Hadoop的DEBUG模式没有打开。
已经说明你的hadoop基本配置好了,接下来就是使用Eclipse来进行显示,开发。
步骤10
安装Eclipse
由于在Windows中利用Eclipse插件管理HDFS文件会出现很多难以控制的问题(包括Hadoop的本地库替换等),因此我们可以在Linux中安装Eclipse和对应插件。 需要先按照以前课程的内容安装JDK。
建议使用eclipse版本:neon版本
eclipse-jee-neon-3-linux-gtk-x86_64.tar.gz
下载地址:到eclipse官网自己选择,(这个地址,我稍后补上)
将eclipse需要的插件就是开篇讲的这个:hadoop-eclipse-plugin-2.6.0.jar,放入plugins中
配置插件
设置Hadoop插件
在插件中确定Hadoop的安装位置,即系统的$HADOOP_HOME
打开MapReduce视图
Windows->Show View->Other…
配置HDFS和MapReduce服务器地址
右键选择新建:新建VH,如果能有弹出框,证明插件没有问题,如果出不来,那就说明插件有问题。
管理远程HDFS文件
步骤11
配置远程MapReduce路径后即可通过Eclipse方便的查看、管理Hadoop HDFS文件
- MapReduce程序运行两种方式 Eclipse端直接运行,
- 远程访问MapReduce 打包为jar文件,拷贝到Hadoop服务器执行
直接在Eclipse运行WordCount远程访问MapReduce
运行时需要为程序提供参数,代表程序的
输入和输出 输入和输出不能以文件路径的方式存在,否则将会访问本地资源,应该使用’hdfs://主机:端口/路径’的方式提供
途中的案例是:
hdfs://localhost:9000/user/hadoop/input/README.txt hdfs://localhost:9000/output/ide
注意其中的空格
添加jar包,一定要把jar包放全:jar包的位置是在于这个位置
程序运行时请确保输出路径不存在,否则程序将输出异常而不能正常执行(空文件夹也不行),因此如果再次运行的话需要将之前的运行结果删除
在使用打包JAR方式执行之前 先将之前生成的执行结果删除
步骤12
使用自定义的JAVA类,来实现词数统计
增加一个WordCount.java类
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;
import org.apache.hadoop.util.GenericOptionsParser;
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();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
@SuppressWarnings("deprecation")
Job job = new Job(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(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
运行:右键选择运行
结果如下:
在output下ide文件夹内,生成两个文件,结果是分词文件,展示其中内容如上。
如果我需要自定义一个文件那么我可以在任意一个位置创建文件比如:
在eclipse中上传自己要准备的文件:Upload File to DFS
然后执行WordCount类
刷新output,使用
会看到这个文件内容,结果OK
已经实现了单词计数的基本功能,也标志着使用Ubuntu+Hadoop+Eclipse实现了该功能。
精彩内容继续,您的点赞(๑•̀ㅂ•́)و✧是我的动力,感谢你的支持,谢谢