Hadoop的部分用法

前言

Hadoop是一个由Apache基金会开发的开源框架,它允许跨多个机器使用分布式处理大数据集。Hadoop的核心是HDFS(Hadoop Distributed File System)和MapReduce编程模型。

1. Hadoop环境搭建

在开始使用Hadoop之前,你需要搭建Hadoop环境。这通常包括安装Java、配置Hadoop环境变量、配置Hadoop的配置文件等步骤。

1.1 环境准备

在开始安装Hadoop之前,你需要准备一个满足Hadoop运行要求的环境。以下是最低的配置要求:

  • 操作系统:推荐使用Linux发行版,如Ubuntu或CentOS。
  • Java:Hadoop需要Java运行环境,确保已安装Java并配置好环境变量。
  • 磁盘空间:至少10GB的可用磁盘空间。
  • 内存:至少2GB的RAM。
  • 网络:确保网络连接正常。

1.2下载Hadoop

访问Hadoop官网或使用wget命令下载最新版本的Hadoop。例如:

wget http://www.example.com/hadoop-2.7.7.tar.gz

将下载的Hadoop压缩包保存到你的服务器上。

1.3 解压Hadoop

解压下载的Hadoop压缩包到指定目录,例如:

tar -zxvf hadoop-2.7.7.tar.gz -C /opt/hadoop

这将把Hadoop解压到/opt/hadoop目录。

1.4 配置环境变量

编辑.bashrc文件,加入Hadoop的环境变量,并使其立即生效:

nano ~/.bashrc

添加以下内容到文件末尾:

export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

然后,使更改生效:

source ~/.bashrc

1.5 配置Hadoop文件

需要配置Hadoop的一些核心配置文件,这些文件位于$HADOOP_HOME/etc/hadoop/目录下。

1.5.1 配置hadoop-env.sh文件

编辑hadoop-env.sh文件,指定Java的安装路径:

nano $HADOOP_HOME/etc/hadoop/hadoop-env.sh

在文件中添加:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
1.5.2 配置core-site.xml文件

编辑core-site.xml文件,指定HDFS的默认文件系统和临时文件存储目录:



    
    
        fs.defaultFS 
        hdfs://localhost:9000 
    
    
    
        hadoop.tmp.dir 
        /opt/hadoop/tmp 
    
1.5.3 配置hdfs-site.xml文件

编辑hdfs-site.xml文件,配置文件的副本数和块的大小:



    
    
        dfs.replication 
        1 
    

1.6 启动Hadoop集群

启动Hadoop集群涉及到几个关键步骤,这些步骤确保了Hadoop的各个组件能够正常运行。以下是启动Hadoop集群的详细步骤:

1.6.1 格式化HDFS

在启动Hadoop集群之前,需要对HDFS进行格式化。这个步骤只需要执行一次,它会创建HDFS的命名空间和存储文件系统的元数据。

hdfs namenode -format

1.6.2 启动Hadoop守护进程

Hadoop集群由多个守护进程组成,包括NameNode、DataNode、ResourceManager、NodeManager等。以下是启动这些守护进程的命令:

# 启动HDFS守护进程
start-dfs.sh

# 启动YARN守护进程
start-yarn.sh

这些脚本会启动Hadoop的文件系统和资源管理器守护进程。在完全分布式配置中,你还需要启动其他守护进程,如SecondaryNameNode、ResourceManager等。

1.6.3 启动其他Hadoop服务

除了HDFS和YARN,Hadoop生态系统还包括其他服务,如HBase、Hive等。这些服务需要单独启动。

1.7验证Hadoop是否安装成功

验证Hadoop是否安装成功,可以通过以下几种方式:

1.7.1 查看守护进程状态

使用jps命令查看Java进程,确认Hadoop的守护进程是否在运行:

jps

你应该会看到NameNode、DataNode、ResourceManager、NodeManager等进程。

1.7.2 查看HDFS健康状况

使用hdfs dfsadmin -report命令查看HDFS的健康状况和状态:

hdfs dfsadmin -report

这个命令会显示集群的总体状态,包括NameNode的信息、DataNode的数量和状态等。

1.7.3 访问Hadoop Web UI

Hadoop提供了Web界面来监控集群状态。默认情况下,NameNode和ResourceManager的Web UI分别运行在以下端口:

  • NameNode: 50070
  • ResourceManager: 8088

在浏览器中输入http://:50070http://:8088,查看集群的实时状态和资源使用情况。

1.8 运行一个MapReduce作业

为了验证Hadoop是否完全安装成功,可以运行一个简单的MapReduce作业。Hadoop提供了一些示例程序,例如wordcount。以下是运行wordcount作业的命令:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount  

替换为HDFS上的输入文件路径,替换为输出结果的路径。如果作业成功运行,你可以在指定的输出路径查看结果文件。

1.9 查看日志文件

如果遇到问题,查看Hadoop的日志文件也是一个好方法。日志文件通常位于$HADOOP_HOME/logs/目录下。

1.9.1 定位日志文件

Hadoop的日志文件通常位于Hadoop安装目录下的logs子目录中。对于大多数安装,这个路径可能是:

$HADOOP_HOME/logs

这里$HADOOP_HOME是Hadoop的安装目录,例如/opt/hadoop

1.9.2 查看日志文件

你可以使用Linux系统的命令行工具来查看日志文件。以下是一些常用的命令:

1.9.2.1 使用cat命令
cat $HADOOP_HOME/logs/hadoop--.log

这里的是运行Hadoop守护进程的用户名,是守护进程的名称,如namenodedatanoderesourcemanager等。

1.9.2.2 使用tail命令

如果你只对日志文件的最后几行感兴趣,可以使用tail命令:

tail -n 20 $HADOOP_HOME/logs/hadoop--.log

这将显示日志文件的最后20行。

1.9.2.3 使用grep命令

如果你在寻找包含特定文本的日志条目,可以使用grep命令:

grep "ERROR" $HADOOP_HOME/logs/hadoop--.log

这将显示所有包含“ERROR”文本的日志条目。

1.9.3 分析日志文件

日志文件通常包含以下几个部分:

  • 日期和时间:每条日志消息前都有时间戳。
  • 日志级别:如INFO、WARN、ERROR等,表示日志消息的严重程度。
  • 守护进程名称:如NameNode、DataNode等。
  • 日志消息:描述事件的详细信息。

1.9.4 日志文件类型

Hadoop生成多种类型的日志文件,包括:

  • NameNode日志:记录与HDFS NameNode相关的信息。
  • DataNode日志:记录与HDFS DataNode相关的信息。
  • ResourceManager日志:记录与YARN ResourceManager相关的信息。
  • NodeManager日志:记录与YARN NodeManager相关的信息。
  • 任务日志:记录MapReduce任务的运行信息。

1.9.5 查看任务日志

对于MapReduce作业,Hadoop还会在HDFS上生成任务日志。这些日志文件位于作业的输出目录下,通常以stdoutstderr为文件名。你可以使用以下命令查看这些日志:

hdfs dfs -cat /path/to/job/output/stdout
hdfs dfs -cat /path/to/job/output/stderr

1.9.6 清理日志文件

随着时间的推移,日志文件可能会占用大量的磁盘空间。你可以定期清理旧的日志文件,或者配置日志轮转策略来自动管理日志文件的大小和数量。

2. HDFS基本操作

HDFS是Hadoop的分布式文件系统,以下是一些基本的HDFS操作命令:

2.1 查看文件系统状态

hdfs dfsadmin -report

作用: 显示HDFS的总体状态和每个节点的状态。

2.2 创建目录

hdfs dfs -mkdir /user/hadoop/hadoopdir

作用: 在HDFS上创建一个名为hadoopdir的目录。

2.3 上传文件

hdfs dfs -put localfile /user/hadoop/hadoopdir

作用: 将本地文件localfile上传到HDFS的/user/hadoop/hadoopdir目录。

2.4 查看文件内容

hdfs dfs -cat /user/hadoop/hadoopdir/filename

作用: 显示HDFS上/user/hadoop/hadoopdir目录下filename文件的内容。

2.5 删除文件

hdfs dfs -rm /user/hadoop/hadoopdir/filename

作用: 删除HDFS上的filename文件。

3. MapReduce编程模型

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。它由Map任务和Reduce任务组成。

3.1 Map任务

Map任务负责处理输入数据并产生中间键值对。

/ 定义一个Mapper类,继承自Mapper基类
public static class TokenizerMapper
       extends Mapper {

    // 定义一个静态常量,用于表示单词出现的次数,初始值为1
    private final static IntWritable one = new IntWritable(1);
    // 定义一个Text类型的变量,用于存储处理后的单词
    private Text word = new Text();

    // 定义map方法,它是Mapper类的核心方法,用于处理输入数据
    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
        // 使用StringTokenizer对输入的文本value进行分词
        StringTokenizer itr = new StringTokenizer(value.toString());
        // 循环处理每个单词
        while (itr.hasMoreTokens()) {
            // 获取下一个单词,并将其设置到word变量中
            word.set(itr.nextToken());
            // 将单词及其对应的计数(这里是1)输出到上下文context中,以便后续的Reducer处理
            context.write(word, one);
        }
    }
}

作用: 这个Mapper类会读取输入的文本行,然后对每一行进行分词,统计每个单词出现的次数。

3.2 Reduce任务

Reduce任务负责接收Map任务输出的中间键值对,并进行汇总。

// 定义一个Reducer类,继承自Reducer基类
public static class IntSumReducer
       extends Reducer {
    // 定义一个IntWritable类型的变量,用于存储单词的总计数
    private IntWritable result = new IntWritable();

    // 定义reduce方法,它是Reducer类的核心方法,用于处理Mapper输出的数据
    public void reduce(Text key, Iterable values,
                       Context context
                       ) throws IOException, InterruptedException {
        // 初始化计数器sum
        int sum = 0;
        // 遍历所有与当前key(单词)相关联的值(计数)
        for (IntWritable val : values) {
            // 将每个值加到sum中
            sum += val.get();
        }
        // 将总计数设置到result变量中
        result.set(sum);
        // 将最终的单词计数输出到上下文context中,这样它们就可以被写入到最终的输出文件中
        context.write(key, result);
    }
}

作用: 这个Reducer类会接收每个单词的计数,然后计算总和,并输出每个单词的总出现次数。

3.3 运行MapReduce作业

hadoop jar wordcount.jar WordCount /user/hadoop/hadoopdir/input /user/hadoop/hadoopdir/output

作用: 运行名为wordcount.jar的MapReduce作业,输入路径为/user/hadoop/hadoopdir/input,输出路径为/user/hadoop/hadoopdir/output

4. 常见问题解决

  • 环境变量未设置: 确保HADOOP_HOME环境变量已经设置,并且$HADOOP_HOME/etc/hadoop目录下的配置文件已经正确配置。
  • 权限问题: 确保运行Hadoop命令的用户有足够的权限访问HDFS。
  • 网络问题: 确保所有Hadoop节点之间的网络通信是正常的。

5. 进阶使用

  • Hadoop集群管理: 学习如何管理Hadoop集群,包括添加节点、移除节点等。

adoop集群管理:添加节点与移除节点

添加节点到Hadoop集群

  1. 准备新节点环境:确保新节点的操作系统、Java环境和Hadoop版本与现有集群一致。

  2. 修改配置文件

    • hdfs-site.xml中添加新节点信息,例如:
      
        dfs.hosts
        $NODE_IP
      
      其中$NODE_IP是新节点的IP地址。
    • 将新节点添加到slaves文件中,该文件列出了所有的DataNode节点。
  3. 启动Hadoop服务:在新节点上启动Hadoop服务并重启NameNode和DataNode。

    • 启动DataNode服务示例命令:
      ssh $NODE_IP "cd /path/to/hadoop && bin/hadoop-daemon.sh start datanode"
      其中$NODE_IP是新节点的IP地址。
  4. 验证集群状态:确认新节点已经成功加入集群,可以通过访问Hadoop的Web UI界面或使用命令hdfs dfsadmin -report来查看集群状态。

移除节点从Hadoop集群

  1. 停止节点上的服务:在删除节点之前,需要先停止节点上运行的所有Hadoop服务。可以使用以下命令来停止服务:

    hadoop-daemon.sh stop datanode

    几分钟后,节点将从Decommissioned进入Dead状态。

  2. 从集群配置中删除节点

    • hdfs-site.xml中添加过滤配置,排除节点:
      
        dfs.hosts.exclude
        /your_path/excludes
      
      excludes文件中添加要排除的节点主机名,一行一个。
    • 刷新datanode:
      hdfs dfsadmin -refreshNodes
      hdfs dfsadmin -report
      通过命令也可以查看状态。
  3. 更新节点文件:Hadoop使用一个节点文件来记录集群中所有的活动节点。在删除节点后,需要更新节点文件。节点文件通常位于/etc/hadoop/conf目录下,文件名可能为slavesworkers。打开节点文件,删除包含要删除节点信息的行

  • Hadoop生态系统: 探索Hadoop生态系统中的其他组件,如HBase、Hive、Pig等。

以下是Hadoop生态系统中的一些关键组件及其用途和使用方法:

HBase

用途:

  • HBase是一个分布式、可扩展、面向列的NoSQL数据库,它建立在HDFS之上,适合于大规模数据集的随机实时读/写访问。

怎么用:

  1. 启动和停止HBase:

    # 启动HBase
    start-hbase.sh
    
    # 停止HBase
    stop-hbase.sh
  2. HBase Shell命令:

    • 进入HBase Shell:
      hbase shell
    • 创建表:
      create 'mytable', 'cf'
    • 插入数据:
      put 'mytable', 'row1', 'cf:qualifier1', 'value1'
    • 获取数据:
      get 'mytable', 'row1'
    • 扫描表:
      scan 'mytable'

Hive

用途:

  • Hive是一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能(HiveQL),适用于数据仓库的构建、数据汇总、以及复杂的数据分析。

怎么用:

  1. 启动Hive:l

    # 进入Hive Shell
    hive
  2. HiveQL命令:

    • 创建表:
      CREATE TABLE mytable (id INT, name STRING);
    • 插入数据:
      INSERT INTO mytable VALUES (1, 'John');
    • 查询数据:
      SELECT * FROM mytable;

Pig

用途:

  • Pig是一个高级平台,用于创建MapReduce程序,它提供了一种称为Pig Latin的脚本语言,适用于数据流的ETL(提取、转换、加载)操作。

怎么用:

  1. 运行Pig Latin脚本:
    • 进入Pig Shell:
      pig
    • 在Pig命令行中运行:
      A = LOAD 'input_data' USING PigStorage() AS (name:chararray, age:int);
      B = GROUP A BY name;
      C = FOREACH B GENERATE group, COUNT(A.age) AS cnt;
      DUMP C;
    • 或者,将Pig Latin脚本保存在一个文件中,然后运行:
      pig myscript.pig

这些组件的使用示例提供了基本的操作流程,帮助您快速上手Hadoop生态系统中的各个组件。

请注意,这份手册只是一个简单的入门指南,Hadoop的深入学习和使用需要更多的实践和探索。

你可能感兴趣的:(hadoop,hive,大数据,分布式)