Hadoop3.x 环境搭建&&填坑

  • 环境配置 && 安装JDK && 安装Hadoop
  • Hadoop运行模式之单机模式(官网Grep+WordCount案例)
  • 官方Grep案例
  • 官方WordCount案例
  • Hadoop运行模式之伪分布式模式
  • 1. 分析
  • 2. 步骤
  • 问题
  • 下面开始填坑
  • 端口: 50070 ----> 9870
  • 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  • 执行rsync 命令报错 ===> 需要同步的服务器都要安装这个命令(同步和被同步的机器)
  • 集群配置文件修改
  • etc/hadoop/workers # 替换2.x版本的slaves
  • 安装时间同步器


环境配置 && 安装JDK && 安装Hadoop

笔者自学大数据笔记

  1. 设置静态IP
vim /etc/sysconfig/network-scripts/ifcfg-eth0

NAME=eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
HWADDR=00:50:56:25:71:6a
IPADDR=192.168.0.111
GATEWAY=192.168.0.1
DNS1=192.168.0.1

# 保存退出
  1. 修改主机名
vim /etc/sysconfig/network

HOSTNAME=hadoop01
  1. 关闭防火墙
# 关闭防火墙 (开启:start,重启:restart,关闭:stop,状态:status,开启自启动:enable,关闭自启动:disable)
systemctl stop firewalld
# 重启防火墙这样也可以
firewall-cmd --reload

# 关闭防火墙自启动
systemctl disable firewalld
# 列出开放的所有端口
firewall-cmd --list-ports
# 查询某个端口是否开放 eg:3306  响应:yes或no
firewall-cmd --zone=public --query-port=3306/tcp
# 添加防火墙端口后,要重启防火墙才生效
# 添加一个端口  eg:3306    持久开启(服务器重启,依然保持开启状态,不添加则属于临时添加端口): --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 添加一组连续的端口  eg:3306,3307,3308,3309
firewall-cmd --zone=public --add-port=3306-3309/tcp --permanent
  1. 创建dev用户
#创建用户  默认创建分组(名跟用户名一样)并将用户添加到该组中
useradd dev

# 创建分组  eg:新建分组devgroup
groupadd devgroup
# 新建用户同时添加分组  eg:新建用户aaa并将其添加到已有的devgroup分组中
useradd -g devgroup aaa
# 给已有用户添加分组 eg:将已存在用户dev添加到已存在分组devgroup中
usermod -G devgroup dev
# 查询centos7目前有哪些用户 # cut -d : -f 1 /etc/passwd
cat /etc/passwd
# 查询目前用户分组情况
cat /etc/group
  1. 配置hadoop具有root权限
  1. 先用root账户修改 /etc/sudoers 文件权限为可编辑,默认只读 (-r–r-----)
  2. 修改文件 添加用户权限
  3. 改回 /etc/sudoers 文件权限为只读
#步骤1)
chmod 777 /etc/sudoers

#步骤 2)
vim /etc/sudoers
# 复制 [ root    ALL=(ALL)       ALL ]  这行添加在下面修改下用户名就可以  eg:dev用户添加具有root权限
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
dev    ALL=(ALL)       ALL
# 保存退出

#步骤3)
chmod 440 /etc/sudoers
  1. /opt目录创建module software文件夹
mkdir /opt/software /opt/module
  1. 修改module software文件夹所有者为dev用户:dev分组
# -R 递归文件夹,修改文件,文件夹拥有者
chown -R dev:dev /opt/software /opt/module
  1. 安装JDK(上传压缩包,解压,配置环境变量,配置文件生效source一下),此处略过~~
  2. 安装hadoop(上传压缩包,解压,配置环境变量 bin目录 && sbin目录 ,配置文件生效source一下),此处略过~~

Hadoop运行模式之单机模式(官网Grep+WordCount案例)

官方Grep案例

  1. 在hadoop-3.3.0文件夹下面创建一个input文件夹
mkdir input
  1. 将hadoop的etc文件夹下xml配置文件复制到input 注意:output文件夹不能存在,否则报错文件已存在异常 FileAlreadyExistsException: Output directory file:/opt/module/hadoop-3.3.0/output already exists
cp /opt/module/hadoop-3.3.0/etc/hadoop/*.xml ../../input
  1. 执行share目录下的MapReduce程序
    如果遇到执行程序找不到主类: 看你执行命令是否为 hadoop jar xxx,以为hadoop xxx就可以啦O~O
    error : [ 错误: 找不到或无法加载主类 share.hadoop.mapreduce.hadoop-mapreduce-examples-3.3.0.jar ]
hadoop jar /opt/module/hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar grep input output 'dfs[a-z.]+'
  1. 查看输出结果
cat output/part-r-00000

# 显示结果
1	dfsadmin

官方WordCount案例

  1. 在hadoop-3.3.0文件夹下面创建一个wcinput文件夹
mkdir wcinput
  1. 在 wcinput 文件下创建一个 wc.txt文件,并添加内容
# 创建文件命令 # touch wc.txt
vim wc.txt

# wc.txt文件内容 随意单词 eg:↓↓↓
hello word map reduce yarn 
hadoop hadoop dev dev test
test test aaa
cechsi namenode datanode resourcemanager
who
am
i

# 保存退出 :wq
  1. 回到hadoop-3.3.0文件夹下执行wordcount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount wcinput/wc.txt output
  1. 查看结果
cat wcoutput/part-r-00000

# 显示结果
aaa	1
am	1
cechsi	1
datanode	1
dev	2
hadoop	2
hello	1
i	1
map	1
namenode	1
reduce	1
resourcemanager	1
test	3
who	1
word	1
yarn	1

Hadoop运行模式之伪分布式模式

1. 分析

1)配置集群

2)启动,测试集群增/删/改

3)执行WordCoung案例

2. 步骤

1)配置集群

  • 配置hadoop文件夹下etc/hadoop/adoop-env.sh
# 查看 $JAVA_HOME
echo $JAVA_HOME
/opt/module/jdk1.8.0_221/bin

# 修改etc/hadoop/adoop-env.sh中JAVA_HOME配置
export JAVA_HOME=/opt/module/jdk1.8.0_221/bin
# 保存退出 :wq
  • 配置core-site.xml
<!-- 指定HDFS 中 NameNode 的地址 -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://hadoop101:9000</value>
</property>

<!-- 指定Hadoop 运行时产生文件的存储目录 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/module/hadoop-3.3.0/data/tmp</value>
</property>
  • 配置hfs-site.xml
<!-- 指定HDFS 副本的数量,默认副本数:3 -->
<property>
	<name>dfs.replication</name>
	<value>1</value>
</property>

2)启动集群(hadoop文件夹下)

  • 格式化NameNode(第一次启动时格式化,以后就不要总格式化)
bin/hdfs namenode -format
  • 启动NameNode
sbin/hadoop-daemon.sh start namenode
  • 启动DataNode
sbin/hadoop-daemon.sh start datanode

3)查看集群

  • 查看集群是否启动成功
jps

4755 DataNode
4835 Jps
4630 NameNode
  • WEB端查看HDFS
# hadoop3.x 版本
http://hadoop01:9870
# hadoop2.x版本
http://hadoop01:50070
  • 查看产生的log日志

hadoop防火墙出现enforcing hadoop防火墙设置_hadoop

问题

  • 思考:为什么不能一直格式化 NameNode,格式化NameNode,要注意什么?

注意:格式化NameNode,会产生新的集群 id,导致 NameNode 和DataNode 的集群 id 不一致,集群找不到已往数据。所以,格式 NameNode 时,一定要先删除data 数据和 log 日志,然后再格式化 NameNode

# 查看namenode集群ID
cat data/tmp/dfs/name/current/VERSION

namespaceID=851295736
clusterID=CID-2c00d4b3-1b98-4914-9d80-853c104b65f1

# 查看datanode 集群ID(会发现和namenode中箪集群ID完全一样)
cat data/tmp/dfs/data/current/VERSION

clusterID=CID-2c00d4b3-1b98-4914-9d80-853c104b65f1
datanodeUuid=9fc063f9-dad5-4ac9-a7e9-512a35782361

4)操作集群

下面开始填坑

端口: 50070 ----> 9870


错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

主机执行hadoop classpath,hadoop3.x版本需要配置hadoop classpath,然后重启yarn
vim yarn-site.xml 添加一个配置 hadoop classpath

<property>
        <name>yarn.application.classpath</name>    <value>/opt/module/hadoop-3.3.0/etc/hadoop:/opt/module/hadoop-3.3.0/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.0/share/hadoop/common/*:/opt/module/hadoop-3.3.0/share/hadoop/hdfs:/opt/module/hadoop-3.3.0/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.0/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.0/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.0/share/hadoop/yarn:/opt/module/hadoop-3.3.0/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.0/share/hadoop/yarn/*</value>
</property>

执行rsync 命令报错 ===> 需要同步的服务器都要安装这个命令(同步和被同步的机器)

bash: rsync: 未找到命令
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.2]


集群配置文件修改

集群配置 corsite.xml

<!-- 指定HDFS中NameNode的地址 -->
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop02:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.3.0/data/tmp</value>

</property>

修改hadoop-env.sh  &&  yarn-env.sh  &&  mapred-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_221

vim hdfs.site.xml

<property>
        <name>dfs.replication</name>
        <value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>hadoop04:50090</value>
</property>

yarn-site.xml

<!-- Reducer获取数据的方式 -->
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop03</value>
</property>

mapred-site.xml

<!-- 指定MR运行在Yarn上 -->
<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
</property>

etc/hadoop/workers # 替换2.x版本的slaves

192.168.0.112
192.168.0.113
192.168.0.114

安装时间同步器

yum install ntpd

有点乱 嘻嘻