大数据概述

大数据Hadoop的三大组件:HDFS 分布式文件存储,MapReduce 分布式计算引擎,YARN 分布式资源调度

hadoop生态发展

存储: 以前单机所有的数据都是放在一个服务器中的,数据存储有限,一台存不上多写几台,HDFS就是来帮忙做文件的统一管理,提供接口让使用感知上感觉是无限大的

计算:问题,多个机器我怎么做任务的协同和计算,假如计算中节点故障怎么转移,怎么分发,因为这个需求出现了MapReduce(任务并行框架),先把任务分成多份Map,将多个任务计算的结果汇总起来合成一个最终的阶段是Reduce。

为了提高数据的处理想效率能不能在Hadoop中使用sql来实现数据交换什么的 HIve出现了,它实际上就是一个整合,首先把数据的表信息维护好,sql进来调用分析sql生成语法树,调用MR。效率提高了,但是不是很灵活。

spark 是一个计算框架,他是一个基于内存的计算,他的买点就是快,他们都提供了api让用户可以去写程序来调用实现数据的处理,同样在sprk中使用sparkSql能让用户可以在sprk中使用sql快速数据处理,spark也提供了有关事实数据计算的api,可以做实时但是效率不高

概述

什么是大数据?一种规模大到在获取,存储,管理,分析方面都大大超出了传统款据库软件工具能力范围的数据集合。 总结来说 海量数据,具有高增长率,数据类型多样化,一定时间内无法使用常规软件工具进行捕提,管理和处理的数据集合。

大数据的数据特征(4V)一种存储规模大、数据类型多、数据增长快,数据价值密度低 (商业价值高,获取用户行为分析)

数据的一般处理流程:采集-->存储-->清洗-->分析-->展示

数据源-->关系型数据库业务逻辑的数据表;日志文件,用户行为等;爬虫等第三方数据

数据采集和同步-->sqoop,flume采集日志文件数据,kafka用于实时数据流处理

数据存储--> Hive,Hdfs

数据清洗--> Hive,Spark

数据的分析--> MR,Hive,Spark,kafka,Flink

大数据概述 HadoopHA环境搭建和基本开发_mysql


Hadoop概述

Hadoop 是一个开源的分布式计算框架,用于存储和处理大规模数据。

硬盘容量的存储单位:Byte,KB,MB,GB,TB,PB,EB,ZB,YB,DB,NB

Hadoop采用了分而治之的思想,将大量的存储和任务分块处理并行解决。

Hadoop是Apache基金会旗下一个开源的分布式存储和分析计算平台,使用java语言开发,作者是Doug cutting,受google三篇论文的影响,分别是GFS、MapReduce、BigTable,分别对应目前hadoop组件的Hdfs、Mapreduce和Hbase。

大数据概述 HadoopHA环境搭建和基本开发_数据_02

为什么MR和Yarn分离?

在早期的 Hadoop 版本中,MapReduce(MR)和资源管理是紧密结合的。MR 框架不仅负责计算任务,还负责资源的调度和管理。这种紧耦合的设计存在一定的局限性,尤其是在需要扩展或支持其他计算框架时。 那么如果之后MR不受用了其他人要是想要基于Hadoop做计算框架就会很难,独立开之后只要计算框架调用yarn就可以开发自己的计算引擎更加灵活多变。 YARN 可以专注于资源调度和管理,提供更细粒度的资源控制和调度策略 , 通过独立演化,YARN 可以不断优化其资源调度功能,适应不同的计算需求和环境 。

Hadoop HA的安装部署

  1. 设置一台机器的网络为静态的网络设置,vi /etc/sysconfig/network-scripts/ifcfg-ens33
    设置ONBOOT=yes 设置网络上网为 BOOTPROTO=static [static静态获取|hdcp动态获取]
    [动态获取不需要补充这些参数] IPADDR=[IP地址] GATEWAY=[网关地址] NETMASK=255.255.255.0 DNS1=114.114.114.114
  2. 设置一台机器关闭防火墙 systemctl stop firewalld 禁用防火墙 systemctl disable firewalld 【stop 关闭 status 查看防火墙的状态 start 开启防火墙 disable 禁止防火墙自启动】
  3. 添加主机映射 vim /etc/hosts 这里没有克隆虚拟机,我们可以先规划三个IP段为 131,132,133

192.168.10.131 h1 node01 master

192.168.10.132 h2 node02 slave1

192.168.10.133 h3 node03 slave2

  1. 安装Java,解压JDK-linux版本的文件配置java环境变量,yum install vim [安装vim] vim /etc/profile 编辑配置文件 【解压: tar -zxvf [解压文件] -C [指定解压路径]】

# Java Environment

export JAVA_HOME=[解压路径 参考:/usr/local/jdk1.8.0_341]

export PATH=$PATH:$JAVA_HOME/bin

  1. 添加完成后需要手动属性配置文件source /etc/profile,然后直接java -version 查看Java版本,弹出版本号成功。
  2. 解压配置hadoop,将hadoop文件上传并且解压到指定位置中。配置hadoop环境变量 vim /etc/profile 编辑配置文件 加入下面代码:

# Hadoop Environment

export HADOOP_HOME=[Hadoop的解压路径 参考:/usr/local/hadoop-3.3.1]

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

  1. 添加完成可以使用 cd $HADOOP_HOME 测试是否可以进入hadoop根目录

  2. vi /etc/ssh/ssh_config 在host 严格级别设置为 no
  3. Linux安装Mysql

在Linux中推荐使用rpm的方式安装,官网给我们提供了多种下载地址:

MySQL - MySQL服务器。 MySQL-client - MySQL 客户端程序,用于连接并操作Mysql服务器。 MySQL-devel - 库和包含文件。 MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库 MySQL-bench - MySQL数据库服务器的基准和性能测试工具。

  1. 检测系统中是有自带Mysql rpm -qa | grep mysql,如果有 rpm -e mysql 强力:rpm -e --nodeps mysql
  2. 卸载 mariadb rpm -qa | grep mariadbyum remove mariadb-libs ,安装依赖包 net-tools yum install net-tools
  3. 安装Mysql 在官网中找到最适合的版本下载到 /usr/local/src中 这里演示使用8.0.18 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
  4. 创建一个文件夹存放Mysql rpm包 mkdir /usr/local/src/mysql_rpm cd /usr/local/src/mysql_rpm
  5. 按照顺序安装mysql rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpmrpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpmrpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpmrpm -ivh mysql-community-devel-8.0.18-1.el7.x86_64.rpm
  6. 启动mysql systemctl start mysqld
  7. 查看初始密码 cat /var/log/mysqld.log | grep password 使用查找的mysql初始密码登录mysql mysql -u root -p --> 输入初始密码
  8. 修改mysql初始密码

SET GLOBAL validate_password.policy = low;  -- 设置密码的安全级别为低。
SET GLOBAL validate_password.length = 6;    -- 设置密码的最低长度可以是6。
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';   -- 修改密码为 123456[测试环境可以]

  1. 允许远程用户登录并且访问mysql

USE mysql;  -- 选择 MySQL 内部的数据库 `mysql`
UPDATE user SET host = '%' WHERE user = 'root';  -- 允许任何主机连接到这个用户
COMMIT;  -- 提交上述更新操作。
FLUSH PRIVILEGES;  -- -- 刷新 MySQL 的权限表,使之前的更改生效。
EXIT  --退出 MySQL 命令行客户端。

  1. 关机,克隆此虚拟机两份,修改网络为静态,按照host规划配置剩下两个节点的ip
  2. 修改主机名,令其主机名不一致 直接修改vi /etc/hostname 改为想要修改的用户名然后重启
  3. 配置密钥, 在每台机器上都做一遍密钥生成并且发给剩下两台,例如在Node01中ssh-keygen -t rsa 之后 ssh-copy-id h1 (秘钥分发给h1) ssh-copy-id h2 (秘钥分发给h2) ssh-copy-id h3 (秘钥分发给h3) 在h2,h3中重复此操作
  4. 密钥的工作原理 A和B提前配置好加密的需求,互相生成一对公钥和私钥,一个机器拿着一个私钥不发,公钥给对方。现在A给B发消息,a节点用b公钥加密,私钥反向解密,回话b用a公钥加密私钥解密就可以知道说的是什么了,从始至终私钥都没泄密过。
  5. 时间同步 如果没有ntp需要提前安装。ntpdate cn.ntp.org.cn,三台节点都需要运行,再写定时任务 crontab -e 定时任务,添加:ntpdate -u [时钟源IP] , 比如 00 01 * * * root /usr/sbin/ntpdate -u 192.168.111.200
  6. 安装zookeeper
  1. 上传Zookeeper安装包解压到 /usr/local/usr 下 。
  2. cd /usr/local/apache-zookeeper-3.6.3-bin 在zookeeper下创建一个logs日志文件夹和data文件夹 mkdir logs mkdir data 然后我们进入conf将环境变量模板复制一份稍作修改。cd conf cp zoo_sample.cfg zoo.cfg
  3. 编辑 文件vim zoo.cfg

# 修改这条
dataDir=/usr/local/apache-zookeeper-3.6.3-bin/data #更改为自己的路径
dataLogDir=/usr/local/apache-zookeeper-3.6.3-bin/logs  #在最后添加

# 指定节点数量和分别是谁,只需要修改主机名即可
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

  1. 添加环境变量 vim /etc/profile.d/other.sh,将下面的环境变量配置好后source /etc/profile

export ZK_HOME=/usr/local/apache-zookeeper-3.6.3-bin
export PATH=$PATH:$ZK_HOME/bin

  1. 将文件远程分发给其他节点,包括环境变量 用scp或文件分发脚本
  2. 在每个节点上配置myid文件 cd $ZK_HOME/data 在节点1,2,3 分别运行 echo '1' > myid echo '2' > myid echo '3' > myid
  1. 有关zookeeper的一键启动脚本
    start-all-zk
#!/bin/bash

user=$(whoami)
case $1 in
    "start")
        for i in node01 node02 node03
        do
            echo -e "\e[1;34m==================== $i ZKserve 启动 ====================\e[0m"
            ssh $user@$i "/usr/local/src/zookeeper-3.6.3/bin/zkServer.sh start"
        done
        ;;
    "stop")
        for i in h1 h2 h3
        do
            echo -e "\e[1;34m==================== $i ZKserve 停止 ====================\e[0m"
            ssh $user@$i "/usr/local/src/zookeeper-3.6.3/bin/zkServer.sh start"
        done
        ;;
    "status")
        for i in h1 h2 h3
        do
            echo -e "\e[1;34m==================== $i ZKserve 状态展示 ====================\e[0m"
            ssh $user@$i "/usr/local/src/zookeeper-3.6.3/bin/zkServer.sh status"
        done
        ;;
    "restart")
        for i in h1 h2 h3
        do
            echo -e "\e[1;34m==================== $i ZKserve 重启 ====================\e[0m"
            ssh $user@$i "/usr/local/src/zookeeper-3.6.3/bin/zkServer.sh restart"
        done
        ;;
esac

在多台节点下

启动zookeeper zkServer.sh start

查看zookeeper选举状态 zkServer.sh status

14. 修改配置文件 cd $HADOOP_HOME/etc/hadoop

core-site.xml

<?xml versinotallow="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<!-- 设置 NameNode 节点的 URI(包括协议、主机名称、端口号),用于 NameNode DataNode 之间的通讯 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdfs-xzjob1</value>
</property>

<!-- 设置 Hadoop 运行时临时文件的存放位置,比如 HDFS 的 NameNode 数据默认都存放这个目录下 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/src/hadoop-3.3.4/tmp</value>
</property>

<!-- 设置在 Web 界面访问数据时使用的用户名 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>

<!--启用hdfs回收站机制 一天保存期限-->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>

<!--回收站 过期检测程序 720 分钟查询一次-->
<property>
<name>fs.trash.checkpoint.interval</name>
<value>720</value>
</property>

<!-- 设置 HA,需要一组 ZK 地址,以逗号分隔。被 ZKFailoverController 使用于自动失效备援 failover -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>

<!-- 该参数表示可以通过 httpfs 接口访问 HDFS 的 IP 地址限制 -->
<!-- 配置 root(超级用户) 允许通过 httpfs 方式访问 HDFS 的主机名、域名 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>

<!-- 通过 httpfs 接口访问的用户获得的群组身份 -->
<!-- 配置允许通过 httpfs 方式访问的客户端的用户组 -->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>

</configuration>

hdfs-site.xml

<?xml versinotallow="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>

  <!-- 设置 nameservices 列表(联邦列表),逗号分隔 -->
  <property>
    <name>dfs.nameservices</name>
    <value>hdfs-xzjob1</value>
  </property>

  <!-- 设置一个 NameNode 列表。hdfs-xzjob1 是指具体的 nameservice 名称,通常就是 dfs.nameservices 中配置的。值是预备配置的 NameNode 的 ID,ID 是自己取的,不重复就可以,例如 nn1,nn2 -->
  <property>
    <name>dfs.ha.namenodes.hdfs-xzjob1</name>
    <value>nn1,nn2</value>
  </property>

  <!-- 设置 NameNode 的 RPC 地址和端口 -->
  <property>
    <name>dfs.namenode.rpc-address.hdfs-xzjob1.nn1</name>
    <value>node01:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hdfs-xzjob1.nn2</name>
    <value>node02:8020</value>
  </property>

  <!-- 设置 NameNode 的 HTTP 地址和端口 -->
  <property>
    <name>dfs.namenode.http-address.hdfs-xzjob1.nn1</name>
    <value>node01:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hdfs-xzjob1.nn2</name>
    <value>node02:9870</value>
  </property>

  <!-- 设置 QJM 共享存储系统服务器。在多个 NameNode 中共享存储目录,用于存放 edits 文件,该目录由 Active 写,Standby 读 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://node01:8485;node02:8485;node03:8485/hdfs-xzjob1</value>
  </property>

  <!-- 设置 journalnode 用于存放 edits 日志的目录,默认值为 /tmp/hadoop/dfs/journalnode -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/local/src/hadoop-3.3.4/tmp/qjm</value>
  </property>

  <!-- 设置客户端连接 Active NameNode 所用的代理类 -->
  <property>
    <name>dfs.client.failover.proxy.provider.hdfs-xzjob1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

  <!-- 设置 HDFS-HA 功能的防脑裂方法。可以是内建的方法(例如 shell 和 sshfence)或者用户自定义的方法 -->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>shell(true)</value>
  </property>

  <!-- 设置失效转移时使用的秘钥文件 -->
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>

  <!-- 设置故障转移功能是否开启,建议开启 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>

  <!-- 设置 HDFS 默认的数据块副本数。可以在创建文件时指定,如果创建时未指定,则使用默认值 -->
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>

  <!-- 动态下线的冗余配置 -->
  <property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/src/hadoop-3.3.4/etc/hadoop/exclude</value>
  </property>

</configuration>

hadoop-env.sh

# 将下面的信息添加到后面
export JAVA_HOME=[java安装路径]
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

works (需要参与的节点名字全部写进去)

node01
node02
node03

14. 先启动ZooKeeper,没有问题之后启动JournalNode,三台机器都需要启动 hdfs --daemon start journalnode,

15 . 格式化NameNode hdfs namenode -format 启动 node01 的 namenode hdfs --daemon start namenode node02 节点同步镜像数据(node02执行) hdfs namenode -bootstrapStandby 格式化 zkfc(第一次配置的情况下使用)hdfs zkfc -formatZK

启动dfs:start-dfs.sh

注意:第一次启动比较麻烦,之后只需要在主节点先打开所有节点的Zookeeper然后再 start-all.sh 即可

16 . JPS查看三个节点的运行节点状态,如下就是成功的案例:

大数据概述 HadoopHA环境搭建和基本开发_zookeeper_03

大数据JAVA开发

打完环境来测试一下集群是否正常,首先,你需要确保你有电脑中的DX运行库 C++运行库 等健全,其次,你需要下载你当前对应的hadoop版本的 zip 包 将里面 bin 目录下的 winutils.exe 和 hadoop.dll 文件拷贝到 C:\Windows\System32 目录下(没有就是没下对)

将 Hadoop 添加到环境变量

  • HADOOP_HOME --> D:\hadoop\hadoop-3.3.4
  • HADOOP_USER_NAME --> root
  • Path --> %HADOOP_HOME%\bin;%HADOOP_HOME%\sbin;
  • JDK 的版本也设置的和服务器版本一致
  • 修改当前 Window 的 hosts(C:\Windows\System32\drivers\etc\hosts)文件,使其可以和服务器中的各个节点通信。

创建项目

  1. 创建一个Maven项目,首先先把下面的pom.xml文件补充到里面:
<?xml versinotallow="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://www.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>hadoop-demo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hadoop-demo</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <hadoop.version>3.3.4</hadoop.version>
    <commons-io.version>2.11.0</commons-io.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-common</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>${commons-io.version}</version>
    </dependency>
    <dependency>
      <groupId>com.janeluo</groupId>
      <artifactId>ikanalyzer</artifactId>
      <version>2012_u6</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.9.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

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

添加环境包

将你集群中的配置文件复制下载到本地,加载到你的resources 目录core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,再编写一个log4j.properties

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Define some default values that can be overridden by system properties
hadoop.root.logger=INFO,console
hadoop.log.dir=.
hadoop.log.file=hadoop.log

# Define the root logger to the system property "hadoop.root.logger".
log4j.rootLogger=${hadoop.root.logger}, EventCounter

# Logging Threshold
log4j.threshold=ALL

# Null Appender
log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender

#
# Rolling File Appender - cap space usage at 5gb.
#
hadoop.log.maxfilesize=256MB
hadoop.log.maxbackupindex=20
log4j.appender.RFA=org.apache.log4j.RollingFileAppender
log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}

log4j.appender.RFA.MaxFileSize=${hadoop.log.maxfilesize}
log4j.appender.RFA.MaxBackupIndex=${hadoop.log.maxbackupindex}

log4j.appender.RFA.layout=org.apache.log4j.PatternLayout

# Pattern format: Date LogLevel LoggerName LogMessage
log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
# Debugging Pattern format
#log4j.appender.RFA.layout.Cnotallow=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n


#
# Daily Rolling File Appender
#

log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}

# Rollover at midnight
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout

# Pattern format: Date LogLevel LoggerName LogMessage
log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
# Debugging Pattern format
#log4j.appender.DRFA.layout.Cnotallow=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n


#
# console
# Add "console" to rootlogger above if you want to use this
#

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n

#
# TaskLog Appender
#
log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender

log4j.appender.TLA.layout=org.apache.log4j.PatternLayout
log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n

#
# HDFS block state change log from block manager
#
# Uncomment the following to log normal block state change
# messages from BlockManager in NameNode.
#log4j.logger.BlockStateChange=DEBUG

#
#Security appender
#
hadoop.security.logger=INFO,NullAppender
hadoop.security.log.maxfilesize=256MB
hadoop.security.log.maxbackupindex=20
log4j.category.SecurityLogger=${hadoop.security.logger}
hadoop.security.log.file=SecurityAuth-${user.name}.audit
log4j.appender.RFAS=org.apache.log4j.RollingFileAppender
log4j.appender.RFAS.File=${hadoop.log.dir}/${hadoop.security.log.file}
log4j.appender.RFAS.layout=org.apache.log4j.PatternLayout
log4j.appender.RFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
log4j.appender.RFAS.MaxFileSize=${hadoop.security.log.maxfilesize}
log4j.appender.RFAS.MaxBackupIndex=${hadoop.security.log.maxbackupindex}

#
# Daily Rolling Security appender
#
log4j.appender.DRFAS=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFAS.File=${hadoop.log.dir}/${hadoop.security.log.file}
log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout
log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
log4j.appender.DRFAS.DatePattern=.yyyy-MM-dd

#
# hadoop configuration logging
#

# Uncomment the following line to turn off configuration deprecation warnings.
# log4j.logger.org.apache.hadoop.conf.Configuration.deprecatinotallow=WARN

#
# hdfs audit logging
#
hdfs.audit.logger=INFO,NullAppender
hdfs.audit.log.maxfilesize=256MB
hdfs.audit.log.maxbackupindex=20
log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=${hdfs.audit.logger}
log4j.additivity.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=false
log4j.appender.RFAAUDIT=org.apache.log4j.RollingFileAppender
log4j.appender.RFAAUDIT.File=${hadoop.log.dir}/hdfs-audit.log
log4j.appender.RFAAUDIT.layout=org.apache.log4j.PatternLayout
log4j.appender.RFAAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n
log4j.appender.RFAAUDIT.MaxFileSize=${hdfs.audit.log.maxfilesize}
log4j.appender.RFAAUDIT.MaxBackupIndex=${hdfs.audit.log.maxbackupindex}

#
# NameNode metrics logging.
# The default is to retain two namenode-metrics.log files up to 64MB each.
#
namenode.metrics.logger=INFO,NullAppender
log4j.logger.NameNodeMetricsLog=${namenode.metrics.logger}
log4j.additivity.NameNodeMetricsLog=false
log4j.appender.NNMETRICSRFA=org.apache.log4j.RollingFileAppender
log4j.appender.NNMETRICSRFA.File=${hadoop.log.dir}/namenode-metrics.log
log4j.appender.NNMETRICSRFA.layout=org.apache.log4j.PatternLayout
log4j.appender.NNMETRICSRFA.layout.ConversionPattern=%d{ISO8601} %m%n
log4j.appender.NNMETRICSRFA.MaxBackupIndex=1
log4j.appender.NNMETRICSRFA.MaxFileSize=64MB

#
# DataNode metrics logging.
# The default is to retain two datanode-metrics.log files up to 64MB each.
#
datanode.metrics.logger=INFO,NullAppender
log4j.logger.DataNodeMetricsLog=${datanode.metrics.logger}
log4j.additivity.DataNodeMetricsLog=false
log4j.appender.DNMETRICSRFA=org.apache.log4j.RollingFileAppender
log4j.appender.DNMETRICSRFA.File=${hadoop.log.dir}/datanode-metrics.log
log4j.appender.DNMETRICSRFA.layout=org.apache.log4j.PatternLayout
log4j.appender.DNMETRICSRFA.layout.ConversionPattern=%d{ISO8601} %m%n
log4j.appender.DNMETRICSRFA.MaxBackupIndex=1
log4j.appender.DNMETRICSRFA.MaxFileSize=64MB

# Custom Logging levels

#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG
#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
#log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=DEBUG


# AWS SDK & S3A FileSystem
#log4j.logger.com.amaznotallow=ERROR
log4j.logger.com.amazonaws.http.AmazonHttpClient=ERROR
#log4j.logger.org.apache.hadoop.fs.s3a.S3AFileSystem=WARN

#
# Event Counter Appender
# Sends counts of logging messages at different severity levels to Hadoop Metrics.
#
log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter


#
# shuffle connection log from shuffleHandler
# Uncomment the following line to enable logging of shuffle connections
# log4j.logger.org.apache.hadoop.mapred.ShuffleHandler.audit=DEBUG

#
# Yarn ResourceManager Application Summary Log
#
# Set the ResourceManager summary log filename
yarn.server.resourcemanager.appsummary.log.file=rm-appsummary.log
# Set the ResourceManager summary log level and appender
yarn.server.resourcemanager.appsummary.logger=${hadoop.root.logger}
#yarn.server.resourcemanager.appsummary.logger=INFO,RMSUMMARY

# To enable AppSummaryLogging for the RM,
# set yarn.server.resourcemanager.appsummary.logger to
# <LEVEL>,RMSUMMARY in hadoop-env.sh

# Appender for ResourceManager Application Summary Log
# Requires the following properties to be set
#    - hadoop.log.dir (Hadoop Log directory)
#    - yarn.server.resourcemanager.appsummary.log.file (resource manager app summary log filename)
#    - yarn.server.resourcemanager.appsummary.logger (resource manager app summary log level and appender)

log4j.logger.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=${yarn.server.resourcemanager.appsummary.logger}
log4j.additivity.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=false
log4j.appender.RMSUMMARY=org.apache.log4j.RollingFileAppender
log4j.appender.RMSUMMARY.File=${hadoop.log.dir}/${yarn.server.resourcemanager.appsummary.log.file}
log4j.appender.RMSUMMARY.MaxFileSize=256MB
log4j.appender.RMSUMMARY.MaxBackupIndex=20
log4j.appender.RMSUMMARY.layout=org.apache.log4j.PatternLayout
log4j.appender.RMSUMMARY.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n

#
# YARN ResourceManager audit logging
#
rm.audit.logger=INFO,NullAppender
rm.audit.log.maxfilesize=256MB
rm.audit.log.maxbackupindex=20
log4j.logger.org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger=${rm.audit.logger}
log4j.additivity.org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger=false
log4j.appender.RMAUDIT=org.apache.log4j.RollingFileAppender
log4j.appender.RMAUDIT.File=${hadoop.log.dir}/rm-audit.log
log4j.appender.RMAUDIT.layout=org.apache.log4j.PatternLayout
log4j.appender.RMAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n
log4j.appender.RMAUDIT.MaxFileSize=${rm.audit.log.maxfilesize}
log4j.appender.RMAUDIT.MaxBackupIndex=${rm.audit.log.maxbackupindex}

#
# YARN NodeManager audit logging
#
nm.audit.logger=INFO,NullAppender
nm.audit.log.maxfilesize=256MB
nm.audit.log.maxbackupindex=20
log4j.logger.org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger=${nm.audit.logger}
log4j.additivity.org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger=false
log4j.appender.NMAUDIT=org.apache.log4j.RollingFileAppender
log4j.appender.NMAUDIT.File=${hadoop.log.dir}/nm-audit.log
log4j.appender.NMAUDIT.layout=org.apache.log4j.PatternLayout
log4j.appender.NMAUDIT.layout.ConversionPattern=%d{ISO8601}%p %c{2}: %m%n
log4j.appender.NMAUDIT.MaxFileSize=${nm.audit.log.maxfilesize}
log4j.appender.NMAUDIT.MaxBackupIndex=${nm.audit.log.maxbackupindex}

# HS audit log configs
#mapreduce.hs.audit.logger=INFO,HSAUDIT
#log4j.logger.org.apache.hadoop.mapreduce.v2.hs.HSAuditLogger=${mapreduce.hs.audit.logger}
#log4j.additivity.org.apache.hadoop.mapreduce.v2.hs.HSAuditLogger=false
#log4j.appender.HSAUDIT=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.HSAUDIT.File=${hadoop.log.dir}/hs-audit.log
#log4j.appender.HSAUDIT.layout=org.apache.log4j.PatternLayout
#log4j.appender.HSAUDIT.layout.Cnotallow=%d{ISO8601} %p %c{2}: %m%n
#log4j.appender.HSAUDIT.DatePattern=.yyyy-MM-dd

# Http Server Request Logs
#log4j.logger.http.requests.namenode=INFO,namenoderequestlog
#log4j.appender.namenoderequestlog=org.apache.hadoop.http.HttpRequestLogAppender
#log4j.appender.namenoderequestlog.Filename=${hadoop.log.dir}/jetty-namenode-yyyy_mm_dd.log
#log4j.appender.namenoderequestlog.RetainDays=3

#log4j.logger.http.requests.datanode=INFO,datanoderequestlog
#log4j.appender.datanoderequestlog=org.apache.hadoop.http.HttpRequestLogAppender
#log4j.appender.datanoderequestlog.Filename=${hadoop.log.dir}/jetty-datanode-yyyy_mm_dd.log
#log4j.appender.datanoderequestlog.RetainDays=3

#log4j.logger.http.requests.resourcemanager=INFO,resourcemanagerrequestlog
#log4j.appender.resourcemanagerrequestlog=org.apache.hadoop.http.HttpRequestLogAppender
#log4j.appender.resourcemanagerrequestlog.Filename=${hadoop.log.dir}/jetty-resourcemanager-yyyy_mm_dd.log
#log4j.appender.resourcemanagerrequestlog.RetainDays=3

#log4j.logger.http.requests.jobhistory=INFO,jobhistoryrequestlog
#log4j.appender.jobhistoryrequestlog=org.apache.hadoop.http.HttpRequestLogAppender
#log4j.appender.jobhistoryrequestlog.Filename=${hadoop.log.dir}/jetty-jobhistory-yyyy_mm_dd.log
#log4j.appender.jobhistoryrequestlog.RetainDays=3

#log4j.logger.http.requests.nodemanager=INFO,nodemanagerrequestlog
#log4j.appender.nodemanagerrequestlog=org.apache.hadoop.http.HttpRequestLogAppender
#log4j.appender.nodemanagerrequestlog.Filename=${hadoop.log.dir}/jetty-nodemanager-yyyy_mm_dd.log
#log4j.appender.nodemanagerrequestlog.RetainDays=3

# WebHdfs request log on datanodes
# Specify -Ddatanode.webhdfs.logger=INFO,HTTPDRFA on datanode startup to
# direct the log to a separate file.
#datanode.webhdfs.logger=INFO,console
#log4j.logger.datanode.webhdfs=${datanode.webhdfs.logger}
#log4j.appender.HTTPDRFA=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.HTTPDRFA.File=${hadoop.log.dir}/hadoop-datanode-webhdfs.log
#log4j.appender.HTTPDRFA.layout=org.apache.log4j.PatternLayout
#log4j.appender.HTTPDRFA.layout.Cnotallow=%d{ISO8601} %m%n
#log4j.appender.HTTPDRFA.DatePattern=.yyyy-MM-dd


# Appender for viewing information for errors and warnings
yarn.ewma.cleanupInterval=300
yarn.ewma.messageAgeLimitSeconds=86400
yarn.ewma.maxUniqueMessages=250
log4j.appender.EWMA=org.apache.hadoop.yarn.util.Log4jWarningErrorMetricsAppender
log4j.appender.EWMA.cleanupInterval=${yarn.ewma.cleanupInterval}
log4j.appender.EWMA.messageAgeLimitSeconds=${yarn.ewma.messageAgeLimitSeconds}
log4j.appender.EWMA.maxUniqueMessages=${yarn.ewma.maxUniqueMessages}

#
# Fair scheduler state dump
#
# Use following logger to dump the state to a separate file

#log4j.logger.org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.statedump=DEBUG,FSSTATEDUMP
#log4j.additivity.org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.statedump=false
#log4j.appender.FSSTATEDUMP=org.apache.log4j.RollingFileAppender
#log4j.appender.FSSTATEDUMP.File=${hadoop.log.dir}/fairscheduler-statedump.log
#log4j.appender.FSSTATEDUMP.layout=org.apache.log4j.PatternLayout
#log4j.appender.FSSTATEDUMP.layout.Cnotallow=%d{ISO8601} %p %c: %m%n
#log4j.appender.FSSTATEDUMP.MaxFileSize=${hadoop.log.maxfilesize}
#log4j.appender.FSSTATEDUMP.MaxBackupIndex=${hadoop.log.maxbackupindex}

# Log levels of third-party libraries
log4j.logger.org.apache.commons.beanutils=WARN

测试上传方法类

写一个方法来测试自己的文件使用api上传和下载功能是否正常,你可以通过网页端查看hdfs的文件上传是否成功

package com.yjxxt.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.io.IOException;

@DisplayName("HDFS 测试类")
public class HDFSTest {

    private FileSystem fileSystem = null;

    @BeforeEach
    public void hdfsInit() throws IOException {
        // 加载配置文件
        Configuration configuration = new Configuration(true);
        // 获取文件系统
        fileSystem = FileSystem.get(configuration);
    }

    @DisplayName("文件上传与下载")
    @Test
    public void testFileUploadAndDownload() throws IOException {
        // 文件上传 目录换成自己的
        Path srcPath = new Path("D:\\_组件资源包\\后端\\JDK\\JDK8\\jdk-8u351-linux-x64.tar.gz");
        Path destPath = new Path("/jdk/jdk-8u351-linux-x64.tar.gz");
        fileSystem.copyFromLocalFile(srcPath, destPath);

        // 文件下载 不可以和上传一起测试,注意路径
        // Path localPath = new Path("E:\\test");
        // Path hdfsPath = new Path("/jdk/jdk-8u351-linux-x64.tar.gz");
        // fileSystem.copyToLocalFile(hdfsPath, localPath);
    }
}

log4g 红色的输出正常,只要不是编译失败或者不是文件未上传成功就可以,没上传成功注意看配置文件是否对的,如果都试过了那就是写完环境变量没有重启电脑或者集群就是有问题的。

组件配置

首先必须要确保你是用的是专业版,社区版不可以使用,可以在插件商店下载,下载完后重启就可以在右侧看到一个D的组件,点开配置你的hadoop连接,将节点信息填上,角色名写上点击连接就可以在idea中操作hdfs了是不是很方便? 非必要,看实际情况

大数据概述 HadoopHA环境搭建和基本开发_数据_04

连接地址一般为主节点的8020端口。