docker--快速启动功能性Hadoop集群进行功能验证

news2024/11/27 18:50:27

工作时,有时需要快速启动功能性Hadoop集群来测试一些hadoop相关的项目及功能。
本文讲解如何基于docker,快速搭建一个功能性Hadoop集群,来测试验证一些功能。

使用的docker镜像

使用的docker镜像的源码地址是:hadoop-hive-3.1.x-postgres

对应的docker-compose.yml包含如下服务:

  • namenode - Apache Hadoop NameNode
  • datanode - Apache Hadoop DataNode
  • resourcemanager - Apache Hadoop YARN Resource Manager
  • nodemanager - Apache Hadoop YARN Node Manager
  • historyserver - Apache Hadoop YARN Timeline Manager
  • hs2 - Apache Hive HiveServer2
  • metastore - Apache Hive Metastore
  • metastore-db - Postgres DB that supports the Apache Hive Metastore

环境搭建

下载源码

git clone https://github.com/timveil/docker-hadoop.git
mv hadoop-hive-3.1.x-postgres hive
cd hive

修改配置

  • 将core.env中的资源配置修改为:YARN_CONF_yarn_nodemanager_resource_memory___mb=2048
  • 修改docker-compose配置文件,主要是暴露namenode的9820及datanode的9866端口

修改后的docker-compose文件

version: "3.7"

services:

  namenode:
    image: timveil/docker-hadoop-namenode:3.2.x
    container_name: namenode
    hostname: namenode
    environment:
      - CLUSTER_NAME=hive-3.1.x
    env_file:
      - core.env
      - yarn-remote.env
    ports:
      - "9870:9870"
      - "9820:9820"

  datanode:
    image: timveil/docker-hadoop-datanode:3.2.x
    container_name: datanode
    hostname: datanode
    environment:
      - SERVICE_PRECONDITION=namenode:9870
    env_file:
      - core.env
      - yarn-remote.env
    ports:
      - "9864:9864"
      - "9866:9866"

  resourcemanager:
    image: timveil/docker-hadoop-resourcemanager:3.2.x
    container_name: resourcemanager
    hostname: resourcemanager
    environment:
      - SERVICE_PRECONDITION=namenode:9870 datanode:9864
    env_file:
      - core.env
      - yarn-resource-manager.env
    ports:
      - "8088:8088"

  nodemanager:
    image: timveil/docker-hadoop-nodemanager:3.2.x
    container_name: nodemanager
    hostname: nodemanager
    environment:
      - SERVICE_PRECONDITION=namenode:9870 datanode:9864 resourcemanager:8088
    env_file:
      - core.env
      - yarn-node-manager.env
    ports:
      - "8042:8042"

  historyserver:
    image: timveil/docker-hadoop-historyserver:3.2.x
    container_name: historyserver
    hostname: historyserver
    environment:
      - SERVICE_PRECONDITION=namenode:9870 datanode:9864 resourcemanager:8088
    env_file:
      - core.env
      - yarn-timeline.env
    ports:
      - "8188:8188"

  hs2:
    image: timveil/docker-hadoop-hive-hs2:3.1.x
    container_name: hs2
    hostname: hs2
    environment:
      - SERVICE_PRECONDITION=metastore:9083
    env_file:
      - core.env
      - yarn-remote.env
      - hive.env
    ports:
      - "10000:10000"
      - "10002:10002"

  metastore:
    image: timveil/docker-hadoop-hive-metastore:3.1.1
    container_name: metastore
    hostname: metastore
    environment:
      - SERVICE_PRECONDITION=namenode:9870 datanode:9864 metastore-db:5432
    env_file:
      - core.env
      - yarn-remote.env
      - hive.env
      - metastore.env
    depends_on:
      - namenode
      - datanode
      - metastore-db

  metastore-db:
    image: timveil/docker-hadoop-hive-metastore-db:3.1.x
    container_name: metastore-db
    hostname: metastore-db

启动/停止

docker-compose up -d
docker-compose down

测试

显露的UI WEB

  • Name Node Overview - http://localhost:9870
  • Data Node Overview - http://localhost:9864
  • YARN Resource Manager - http://localhost:8088
  • YARN Node Manager - http://localhost:8042
  • YARN Application History - http://localhost:8188
  • HiveServer 2 - http://localhost:10002

命令行测试

测试hdfs

$ docker-compose exec namenode bash
# hdfs dfs -ls hdfs://namenode:9820/
# hdfs dfs -lsr hdfs://namenode:9820/

测试hive

$ docker-compose exec hs2 bash
# /opt/hive/bin/beeline -u jdbc:hive2://localhost:10000
> show databases;
> show tables;
> CREATE TABLE pokes (foo INT, bar STRING);
> LOAD DATA LOCAL INPATH '/opt/hive/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
> SELECT * FROM pokes;
> !quit

测试其它功能

docker exec -ti namenode /bin/bash
docker exec -ti datanode /bin/bash
docker exec -ti resourcemanager /bin/bash
docker exec -ti nodemanager /bin/bash
docker exec -ti historyserver /bin/bash
docker exec -ti hs2 /bin/bash
docker exec -ti metastore /bin/bash
docker exec -ti metastore-db /bin/bash

JAVA代码测试

基本测试

  • pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.cloud.coder</groupId>
  <artifactId>hadoop-test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hadoop-test</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

  • java源码
package org.cloud.coder;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;


public class HDFSClientTest {

    private static Configuration conf=null;
    private static FileSystem fs=null;

    //初始化方法,用于和HDFS集群建立连接
    @Before
    public void connect2HDFS() throws IOException {
        //设置客户端的身份,以用于和HDFS集群建立连接
        System.setProperty("HADOOP_USER_NAME","root");
        //创建配置对象
        conf = new Configuration();
        //设置操作的文件系统时HDFS,并且指定HDFS操作地址
        conf.set("fs.defaultFS","hdfs://localhost:9820");
        //创建FileDSystem对象实例
        fs = FileSystem.get(conf);
    }

    //测试:创建文件夹
    @Test
    public void mkdir() throws IOException {
        //首先判断文件夹是否存在
        if(!fs.exists(new Path("/test"))){
            //创建文件夹
            fs.mkdirs(new Path("/test"));
        }
    }

    @Test
    public void listDir() throws IOException {
        RemoteIterator<LocatedFileStatus> list =  fs.listFiles(new Path("/"),true);
        while(list.hasNext()){
            LocatedFileStatus fileStatus = list.next();       System.out.println(String.format("%s,%s,%s,%s",fileStatus.isDirectory(),fileStatus.getPath(),fileStatus.getLen(),fileStatus.toString()));

        }
    }


    //关闭客户端和HDFS的连接
    @After
    public void close(){
        //首先判断文件系统实例是否为null
        if(fs!=null) {
            try {
                fs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

kerberos连接测试

  • Java在访问Kerberos认证系统的HDFS时,需要用principal和生成的keytab文件,然后生成UserGroupInformation对象,保存生成的Ticket。
  • 但是每次登陆的时候需要用到UserGroupInformation,但有时不需要也可以,因为UserGroupInformation中的Subject对象是绑定在当前的线程中
  • 若不是同一个线程,则每次都需要重新登陆,但是通过UserGroupInformation.doAs方法,它在验证的时候,会切换线判断是否登陆。
public class HDFSKerberosTest {

    public static void main(String[] args) throws Exception {
        //需要设置krb5.conf文件
        System.setProperty("java.security.krb5.conf", "src/main/resources/krb5.conf");

        String principal = "hdfs";  //Kerberos Principal,如果不然REALM,则使用krb5.conf默认的
        String keytabFile = "src/main/resources/hdfs.keytab";   //KDC生成的keytab文件

        Configuration conf = new Configuration();
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        conf.set("fs.defaultFS", "hdfs://localhost:9820");  //HDFS地址
//使用kerberos认证
//        UserGroupInformation.loginUserFromKeytab(principal, keytabFile);
        UserGroupInformation ugi = UserGroupInformation.getLoginUser();

        //使用UserGroupInformation来获FileSystem
        FileSystem fs = ugi.doAs(new PrivilegedExceptionAction<FileSystem>() {
            @Override
            public FileSystem run() throws Exception {
                return FileSystem.get(conf);
            }
        });

        FileStatus[] fileStatus = fs.listStatus(new Path("/"));
        for (FileStatus fst : fileStatus) {
            System.out.println(fst.getPath());
        }
    }
}

问题解决

启动hive metastore报错

启动hive metastore报如下错误:
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

原因:
/opt/hadoop/share/hadoop/hdfs/lib/guava-27.0-jre.jar
/opt/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar
/opt/hive/lib/guava-19.0.jar

  • 系统找不到相关jar包
  • 同一类型的 jar 包有不同版本存在,系统无法决定使用哪一个

解决方案
删除hive中低版本的guava-19.0.jar包,将hadoop中的guava-27.0-jre.jar复制到hive的lib目录下即可。

具体操作如下:

docker run -it --rm timveil/docker-hadoop-hive-metastore:3.1.x bash
find / -name guava*

rm -rf /opt/hive/lib/guava-19.0.jar
cp /opt/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive/lib/

#然后docker commit
docker commit -m 'process java.lang.NoSuchMethodError' -a 'clouder' 容器ID timveil/docker-hadoop-hive-metastore:3.1.1

启动hive metastore后,立即退出

解决方案如下:

docker-compose run metastore bash
./run.sh

或
docker-compose run metastore /run.sh

文件上传下载 报错

在测试文件上传或下载时,可能会出现这样的错误提示:java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset。
原因:Hadoop访问windows本地文件系统,要求Windows上的本地库能正常工作,其中Hadoop使用某些Windows API来实现类似posix的文件访问权限,而这些功能需要hadoop.dll和winutils.exe来实现。
解决办法:下载Hadoop源码在windows平台编译,编译出windows本地库。然后配置Hadoop环境变量。
使用这里提供的 《hadoop-3.1.4_winutils.zip》(提取码:hadp ),配置好之后重启IDEA即可。具体配置方法如下:

将下载的压缩包解压放在一个名称为英文的目录下(例如D盘的softwares目录),然后在电脑的环境变量中做如下配置:

  • HADOOP_HOME=D:\softwares\hadoop-3.1.4
  • path=;%HADOOP_HOME%\bin

检查方法:在windows中的命令行模式下,输入命令hdfs,然后回车,如果出现以下结果,则说明配置成功。
在这里插入图片描述

参考

使用Java API访问HFDS
docker-hadoop-hive-metastore/blob/3.1.x/Dockerfile
hadoop-hive-3.1.x-postgres

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

挑战杯刷题

字符串相关 字符串相关&#xff1a; 插入元素&#xff1a; str.insert(pos,num,string);//pos是待查入的位置&#xff0c;num是插入几次&#xff0c;string是待插入的字符串 str.insert(pos,string);//与上面insert一样&#xff0c;不过只在pos位置插入string一次查找指定字符串…

[附源码]Node.js计算机毕业设计高校宿舍管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Mac M1配置SSH Key并添加

配置SSH Key 设置github账户信息 添加github的名字和绑定的邮箱 git config --global user.name “your_name” git config --global user.email “your_emailexample.com” 查看一下 git config --global --list 如果添加成功就会显示刚才的名称和邮箱 创建 创建SSH Key s…

关于切换场景加载耗时的优化问题

1&#xff09;关于切换场景加载耗时的优化问题 ​2&#xff09;SpriteAtlas打包AssetBundle后运行时内存大小和什么有关系 3&#xff09;手机上使用MRT的限制和兼容性 4&#xff09;如何控制粒子系统组件数量的上限 这是第317篇UWA技术知识分享的推送。今天我们继续为大家精选了…

大数据-玩转数据-深入浅出K8S

一、K8S和Docker的比较 Docker 是一个开源的、轻量级的容器引擎&#xff0c;和 VMware 虚拟机相比&#xff0c;Docker 使用容器承载应用程序&#xff0c;而不使用操作系统&#xff0c;所以它的开销很少&#xff0c;性能很高。但是&#xff0c;Docker 对应用程序的隔离不如虚拟…

SO_REUSEPORT socket选项介绍以及在nginx上的配置

SO_REUSEPORT (reuseport) 是网络的一个选项设置&#xff1a; 它能开启内核功能&#xff1a;网络链接分配 内核负载均衡&#xff0c;该功能允许多个进程/线程 bind/listen 相同的 IP/PORT&#xff0c;提升了新链接的分配性能。reuseport 也是内核解决 惊群问题 的优秀方案&…

CoSENT:比sentence bert更好的向量表征

本文是对https://spaces.ac.cn/archives/8847文章的总结 有监督的文本表征主流方案是sentence bert&#xff0c;虽然sentence BERT效果还行&#xff0c;但是存在训练和预测不一致的问题&#xff0c;而一些文章也指出而如果直接优化预测目标cos值&#xff0c;效果往往特别差&…

方寸间联结世界,中国直播电商如何诠释“人类命运共同体”?

十几个人凝神屏息地盯着屏幕&#xff0c;仿佛静止了一般&#xff0c;眼睛一眨不眨&#xff0c;生怕错过了什么。直到听到屏幕另一端终于有了动静&#xff0c;悬在他们心里的石头才落下——“谢谢大家的支持&#xff0c;全部没有了。” 话音未落&#xff0c;这边已爆发了欢呼声…

只工作,不上班,「远程办公」是不是理想的工作方式?

在我们90后眼中&#xff0c;上班和工作是两回事。准确来说。上班是为别人做事&#xff0c;而工作是为自己。 圆桌派有一期的话题是“不想工作怎么破&#xff1f;”当时&#xff0c;几位嘉宾说&#xff1a;“不是不想工作&#xff0c;是不想上班”&#xff0c;“周围很多年轻人…

【linux】之 kubernetes安装

一、容器编排工具 docker machinedocker composedocker swarm docker servicedocker stack kubernetesmesosmarathon 二、PaaS平台 OpenShiftRancher 三、认识kubernetes 官方网址 https://kubernetes.io/ https://kubernetes.io/zh/ 中文社区 http://docs.kubernetes.org…

libco 宏分析

// 下面是从libco中导出的宏 #include <iostream> using namespace std;/*以下是计算参数的个数&#xff0c;最多支持7个参数 */ #define comac_get_args_cnt( ... ) comac_arg_n( __VA_ARGS__ ) #define comac_arg_n( _0,_1,_2,_3,_4,_5,_6,_7,N,...) N #define comac_a…

完整的PCB生产工艺到底是怎样的?华秋告诉你

前面&#xff0c;与朋友们分享了一些关于PCB生产工艺的事情。 有的朋友看了后非常感兴趣&#xff0c;私信说——现在的各种PCB资料满天飞&#xff0c;经常彼此间相互不一致&#xff0c;甚至对立&#xff0c;能给我们再讲讲&#xff0c;完整的PCB生产工艺到底是怎样的吗&#x…

Java 8函数式编程

函数式接口 一个接口中&#xff0c;有且只有一个抽象方法&#xff0c;这个接口就叫做函数式接口。常常使用FunctionalInterface注解作为编译校验。满足函数式接口的要求&#xff0c;才能校验通过&#xff0c;否则会在校验阶段失败。 接口中有且只能有一个抽象方法&#xff0c;…

STM32F4 | 外部中断实验

文章目录一、STM32F4 外部中断简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置外部中断本章我们将介绍如何将 STM32F429 的 IO 口作为外部中断输入。一、STM32F4 外部中断简介 这里首先介绍STM32F4 IO 口中断的一些基础概念。STM32F4 的每个 IO 都可以作为外部…

实验五图形用户界面编程

目录 一、目的与任务 二、内容、要求与安排方式 三、实验设备 四、实验步骤 一、目的与任务 掌握常用事件及其处理模型&#xff1b;掌握常用GUI控制组件的使用及其事件的处理&#xff1b;掌握菜单的使用以及对话框的使用。 二、内容、要求与安排方式 1、实验内容与要求&…

SpringCloud系列(五)Nacos 注册中心配置管理的设置及使用

介绍几种 Nacos 常用的配置, 如统一配置管理的步骤, 如何配置自动刷新及多环境配置优先级问题. Nacos 配置管理⚽️ 统一配置管理⚽️⚽️配置自动刷新⚽️⚽️⚽️ 多环境配置优先级⚽️ 统一配置管理 步骤一: 在 Nacos 中添加配置信息, 如添加时间格式的配置内容; 步骤二: …

Ribbon实战与原理剖析

一、ribbon概述 1、ribbon简介 目前主流的负载方案分为以下两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff0…

读写锁的学习与实验

目录 目录 1&#xff0c;场景 2&#xff0c;接口 3&#xff0c;场景模拟 1&#xff0c;场景 有一种场景&#xff0c;读者多&#xff0c;写者少&#xff0c;绝大多数的情况下我们都是在进行读取而不修改&#xff0c;只有少数的情况下我们才会修改。 场景一&#xff1a;比如…

解决jenkins构建失败,空间不足问题

随着构建次数过多&#xff0c;之后jenkins构建会出现空间不足的问题&#xff0c;解决方式如下&#xff1a; 目录 1.配置时&#xff0c;去除旧的构建任务 2.使用脚本&#xff0c;删除历史构建 3.清理磁盘空间 4.重新加载服务器节点 1.配置时&#xff0c;去除旧的构建任务 2…

计算机网络(自顶向下)学习笔记——路由选择算法

第五章—路由选择算法 5.1、路由的概念 路由:按照某种指标(传输延迟,所经过的站点数目等)找到一条 从源节点到目标节点的较好路径 较好路径: 按照某种指标较小的路径指标:站数, 延迟,费用,队列长度等, 或者是一些单纯指标的加权平均采用什么样的指标,表示网络使用者希望网络…