实验1 安装Hadoop

实验2 通过Shell 访问hdfs

实验3 通过Java API 访问HDFS

常见问题:

1. 编译无法通过

参考解决方法

查看Import包是否正确

查看Maven版本是否为自定义版本而不是系统自带版本

查看Maven仓是否为自定义路径。

尝试删除Maven仓或者重新设置Maven仓目录。

重启Idea, 重启系统

查看依赖包是否正确

查看Java包是否安装正确

2. 运行后无法上传文件,或者直接报Configuration错误

参考解决方法

查看Java包配置是否正确

查看Pom文件有没有配置hadoop相关内容

尝试去掉字段

查看Hadoop-windows是否配置正确。注意一定是Windows版本的依赖包不要弄成Linux了!

3. 无法完成下载,或者下载是空文件

查看Hadoop-windows是否配置正确。注意一定是Windows版本的依赖包不要弄成Linux了!

重启Idea, 重启电脑(重启大法好!)

4 其他问题

系统防火墙不让进行多线程操作或者不让写入文件。

尝试用管理员模式进入

尝试关闭防火墙

实验4 WordCount

常见问题:

1. 无法启动集群:

hadoop实验反思 hadoop实验小结_大数据

参考解决方法:
检查pom文件

查看依赖项是否正确,如果报错注意字段,可以尝试删除。

查看是否添加mapreduce的依赖项

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-mapreduce-client-core</artifactId>
  <version>2.9.2</version>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-mapreduce-client-common</artifactId>
  <version>2.9.2</version>
</dependency>

如果修改无效,重启Idea, 重启系统。

2. 可以启动集群,但是运行的时候说output目录有问题

解决方案

删掉output 文件夹

3. Mapredue正常运行,能够生成output文件夹,但是没有内容

查看代码是否正确

查看input文件是否符合要求

查看hadoop-windows 是否安装正确

Text 包没有引用正确

由idea自动生成的函数引用包不正确。

hadoop实验反思 hadoop实验小结_hadoop实验反思_02

这里的Text不是hadoop包,正确如下:

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.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

附参考main文件

package edu.hubu;



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.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class App 

{

    public static void main( String[] args ) throws Exception {

        //创建Configuration对象时,会自动加载默认配置参数

        Configuration conf = new Configuration();

        Job job = Job.getInstance(conf);

        // 1、封装参数:main方法所在的class

        job.setJarByClass(App.class);

        // 2、封装参数: 本次job所要调用的Mapper实现类、Reducer实现类

        job.setMapperClass(WordCountMapper.class);

        job.setReducerClass(WordCountReducer.class);

        // 3、封装参数:本次job的Mapper实现类、Reducer实现类产生的结果数据的key、value类型

        job.setMapOutputKeyClass(Text.class);

        job.setMapOutputValueClass(IntWritable.class);

        job.setOutputKeyClass(Text.class);

        job.setOutputValueClass(IntWritable.class);

        // 4、封装参数:本次job要处理的输入数据集所在路径、最终结果的输出路径

        //需要提前将素材文件保存到windows的d:/wordcount/input目录中

        FileInputFormat.setInputPaths(job, new Path("d:/wordcount/input"));

        FileOutputFormat.setOutputPath(job, new Path("d:/wordcount/output"));  // 注意:输出路径必须不存在

        // 5、封装参数:想要启动的reduce task的数量

        job.setNumReduceTasks(1);

        // 6、提交job给yarn

        boolean res = job.waitForCompletion(true);

        System.exit(res?0:-1);

    }

}

实验5 序列化、分区

1. 结果不正确,字段无法进行分片

Writable序列化的时候readfields()有问题

@Override

    public void readFields(DataInput input) throws IOException {

        // 反序列化

        this.empno = input.readInt();

        this.ename = input.readUTF();

        this.job = input.readUTF();

        this.mgr = input.readInt();

        this.hiredate = input.readUTF();

        this.sal = input.readInt();

        this.comm = input.readInt();

        this.deptno = input.readInt();
      
    }

没有重写 testing()

@Override

    public String toString() {

        return "Employee [empno=" + empno + ", ename=" + ename + ", sal=" + sal + ", deptno=" + deptno + "]";