Linux(Hadoop基础(概述、linux环境下搭建、独立操作、伪分布式、WordCount示例))

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. 启动分布式文件系统

  1. 在终端操作
  • 格式化文件系统: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
  1. 授权后在分布式文件系统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.xmlcore-site.xml
在这里插入图片描述

下载分布文件系统output文件到本地 hdfs dfs -get output,查看结果:
在这里插入图片描述

//下篇再见…谢谢
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章