4. Hadoop HA高可用集群搭建

Hadoop HA高可用集群搭建

1. 环境准备

  • 操作系统:CentOS 7.9
  • Hadoop版本:Hadoop 3.3.6
  • JDK版本:JDK 1.8
  • Hadoop HA集群角色分配:
    • NameNode:kube-40、kube-41
    • DataNode:kube-40、kube-41、kube-42

2. Hadoop 基础环境搭建

下载:

# 准备 hadoop 基础环境
# 所有节点安装JDK 1.8环境
yum install https://home.vimll.com:9999/download/jdk/jdk-8u361-linux-x64.rpm
yum install -y rsync

# hosts
172.16.100.40 kube-40
172.16.100.41 kube-41
172.16.100.42 kube-42

useradd hadoop

# root hadoop 用户各节点免密互通:
su - hadoop
ssh-keygen -t rsa -b 4096
ssh-copy-id hadoop@kube-40
ssh-copy-id hadoop@kube-41
ssh-copy-id hadoop@kube-42

# 创建数据存储目录
mkdir -p /ssd2/hadoop/{dn,nn,jn}

# 下载hadoop并解压:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local/src/
ln -s /usr/local/src/hadoop-3.3.6 /usr/local/hadoop
cd /usr/local/hadoop

# 目录授权:
chown -R hadoop:hadoop /usr/local/hadoop
chown -R hadoop:hadoop /usr/local/src/hadoop-3.3.6
chown -R hadoop:hadoop /ssd2/hadoop

vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

3. Zookeeper 集群部署

下载:

# 部署zookeeper集群
# 下载并解压:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin.tar.gz
tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz -C /usr/local/src/
ln -s /usr/local/src/apache-zookeeper-3.9.2-bin /usr/local/zookeeper

# 配置zookeeper集群
# 添加环境变量
vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

# 创建数据存储目录
mkdir /usr/local/zookeeper/{data,log} -p
# 复制默认配置文件
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
# 编辑配置文件
vim /usr/local/zookeeper/conf/zoo.cfg
# 填入如下内容
tickTime=2000  # 心跳间隔
initLimit=10  # 初始化连接时间
syncLimit=5  # 同步时间
# 数据存储目录
dataDir=/usr/local/zookeeper/data
# 日志存储目录
dataLogDir=/usr/local/zookeeper/log
clientPort=2181  # 客户端连接端口

# zookeeper 集群节点配置节点通信端口与选举端口
server.1=kube-40:2888:3888
server.2=kube-41:2888:3888
server.3=kube-42:2888:3888

# 创建myid文件
echo 1 > /usr/local/zookeeper/data/myid

# 目录授权
chown -R hadoop:hadoop /usr/local/zookeeper
chown -R hadoop:hadoop /usr/local/src/apache-zookeeper-3.9.2-bin

# 分发zookeeper文件到其他节点使用rsync命令
rsync -avzl /usr/local/src/apache-zookeeper-3.9.2-bin root@kube-41:/usr/local/src
rsync -avzl /usr/local/src/apache-zookeeper-3.9.2-bin root@kube-42:/usr/local/src

# 在其他节点上创建软连接
ln -s /usr/local/src/apache-zookeeper-3.9.2-bin /usr/local/zookeeper

# 在其他节点上创建myid文件
# kube-41节点
echo 2 > /usr/local/zookeeper/data/myid
# kube-42节点
echo 3 > /usr/local/zookeeper/data/myid

# 在其他节点上授权
chown -R hadoop:hadoop /usr/local/zookeeper
chown -R hadoop:hadoop /usr/local/src/apache-zookeeper-3.9.2-bin

# 切换到hadoop用户
su - hadoop

# 启动zookeeper集群,分别在所有节点上执行
zkServer.sh start
# 查看zookeeper集群状态
zkServer.sh status

# zookeeper 常用操作命令
zkServer.sh start  # 启动zookeeper
zkServer.sh stop  # 停止zookeeper
zkServer.sh restart  # 重启zookeeper
zkServer.sh status  # 查看zookeeper状态
zkCli.sh  # 进入zookeeper客户端,连接本机
zkCli.sh -server kube-42:2181  # 连接指定服务器

# zookeeper客户端常用命令
help  #显示所有操作命令
ls /  # 查看根目录下的节点
ls / watch  # 监听路径变化
ls2  # 查看当前节点数据并能看到更新次数等数据
create /test "hello"  # 创建节点
create -e  # 创建临时短暂节点
create -s  # 创建顺序带序号的节点
create -es  # 创建临时顺序的节点
get /test  # 获取节点数据
get / watch  # 监听节点的值
set /test "world"  # 修改节点数据
delete /test  # 删除节点
stat -w /  # 查看节点状态
deleteall path  # 递归删除节点
quit  # 退出zookeeper客户端
## 配置开机自起
sudo nano /etc/systemd/system/zookeeper.service

[Unit]
Description=Apache ZooKeeper Server
After=network.target

[Service]
Type=forking
User=hadoop
Group=hadoop
Environment=ZOO_LOG_DIR=/usr/local/zookeeper/logs
Environment=ZOO_LOG4J_PROP=INFO,ROLLINGFILE
Environment=ZOO_CONF_DIR=/usr/local/zookeeper/conf
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start-foreground
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl enable zookeeper.service
sudo systemctl start zookeeper.service

4. HDFS 集群配置

NameNode修改配置文件,应用自定义设置:

# 修改Hadoop配置文件,应用自定义设置:
# 编辑workers文件
vim /usr/local/hadoop/etc/hadoop/workers
# 填入各节点hostname,注意不要有空格
kube-40
kube-41
kube-42

# 配置hadoop-env.sh环境
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 填入如下内容
export JAVA_HOME=/usr/java/jdk1.8.0_361-amd64
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
export HADOOP_PID_DIR=$HADOOP_HOME/pids         # 指定pid文件存放路径

# 添加yarn-env.sh环境变量
vim /usr/local/hadoop/etc/hadoop/yarn-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_361-amd64
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs

vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

配置core-site.xml文件

vim /usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>
  <!--  表示设置 hadoop 的代理用户-->
  <property>
    <!--表示代理用户的组所属-->
    <name>hadoop.proxyuser.hadoop.groups</name>
    <value>*</value>
  </property>
  <property>
    <!--表示任意节点使用 hadoop 集群的代理用户 hadoop 都能访问 hdfs 集群-->
    <name>hadoop.proxyuser.hadoop.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://kube-40:8020</value>
  </property>
  <!-- 设置Hadoop临时目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/tmp</value>
  </property>
  <!-- 设置HDFS数据块大小 -->
  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
  </property>
  <!-- 设置HDFS文件缓冲区大小 -->
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
  <!-- ZooKeeper 集群地址 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>kube-40:2181,kube-41:2181,kube-42:2181</value>
  </property>
  <!-- ZKFC 连接到ZooKeeper 超时时长 -->
  <property>
    <name>ha.zookeeper.session-timeout.ms</name>
    <value>10000</value>
  </property>
</configuration>

配置hdfs-site.xml文件

vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir.perm</name>
    <value>700</value>
  </property>
  <!-- 没有开启权限控制时,任何用户都可以对任意文件进行读写删除等操作 -->
  <property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
  <!-- namenode 数据目录 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/ssd2/hadoop/nn</value>
  </property>
  <!-- datanode 节点数据(即数据块)的存放位置 -->
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/ssd2/hadoop/dn</value>
  </property>
  <!-- 集群服务的逻辑名称 -->
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <!-- NameNode 节点 -->
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>
  <!-- NameNode nn1 节点RPC 地址 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>kube-40:8020</value>
  </property>
  <!-- NameNode nn2 节点RPC 地址 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>kube-41:8020</value>
  </property>
  <!-- NameNode nn1 节点http 通信地址 -->
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>kube-40:50070</value>
  </property>
  <!-- NameNode nn2 节点http 通信地址 -->
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>kube-41:50070</value>
  </property>
  <!-- NameNode 元数据存储路径,在JournalNode 上的共享存储目录 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://kube-40:8485;kube-41:8485;kube-42:8485/mycluster</value>
  </property>
  <!-- Journal Edit Files 的存储目录 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/ssd2/hadoop/jn</value>
  </property>
  <!-- 配置隔离机制,确保在任何给定时间只有一个NameNode处于活动状态 -->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <!-- 使用sshfence 机制需要ssh免密登录 -->
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
  </property>
  <!-- ssh 超时时间 -->
  <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
  </property>
  <!-- 访问代理类,用于确定当前处于Active 状态的NameNode -->
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <!-- 开启自动故障转移 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
  </property>
</configuration>

配置yarn-site.xml文件

<configuration>
<!-- Site specific YARN configuration properties -->
  <!-- 开启YARN HA -->
  <!-- YARN 系统资源配置 -->
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>32768</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>32768</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>16</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>16</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    <description>资源调度策略为公平调度</description>
  </property>
  <!-- 是否启用日志聚合(可选) -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
    <description>开启日志聚合</description>
  </property>
  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/tmp/logs</value>
    <description>程序日志HDFS的存储路径</description>
  </property>
  <!-- 聚合日志在HDFS上的保存时间 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>86400</value>
  </property>
  <property>
    <name>yarn.log.server.url</name>
    <value>http://kube-40:19888/jobhistory/logs</value>
    <description>历史服务器的URL</description>
  </property>
  <!-- 启用RM HA -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <!-- 指定YARN集群中的两个resourcemanager的名称 -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>my-yarn-cluster</value>
  </property>
  <!-- 指定两个resourcemanager的逻辑地址 -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <!-- 指定rm1 的地址 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>kube-40</value>
  </property>
  <!-- 指定rm2 的地址 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>kube-41</value>
  </property>
  <!-- RM1 Web应用程序的地址 -->
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>kube-40:8088</value>
  </property>
  <!-- RM2 Web应用程序的地址 -->
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>kube-41:8088</value>
  </property>
  <!-- RM 集群状态信息存储 -->
  <property>
    <name>yarn.resourcemanager.zk.state-store.address</name>
    <value>kube-40:2181,kube-41:2181,kube-42:2181</value>
  </property>
  <!-- 指定zookeeper 集群的地址 -->
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>kube-40:2181,kube-41:2181,kube-42:2181</value>
  </property>
  <!-- 启用自动恢复 -->
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <!-- 用于进行持久化存储的类 -->
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    <description>为MapReduce程序开启Shuffle服务</description>
  </property>
  <property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/ssd2/hadoop/nm-local</value>
    <description>NodeManager中间数据本地存储路径</description>
  </property>
  <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/ssd2/hadoop/nm-log</value>
    <description>NodeManager数据日志本地存储路径</description>
  </property>
</configuration>

hadoop 开机自起

sudo nano /etc/systemd/system/hadoop.service

# Unit表明该服务的描述,类型描述。
[Unit]
Description=hadoop  # 描述服务名
After=network.target  # 服务级别,低于network,也可以理解为network启动后再启动Hadoop

# 关键部分,用于设置一些关键参数
[Service]
Type=forking  #以fork方式从父进程创建子进程
User=hadoop
Group=hadoop
ExecStart=/usr/local/hadoop/sbin/start-all.sh  # 启动目录
ExecStop=/usr/local/hadoop/sbin/stop-all.sh
PrivateTmp=true  # 是否给服务分配独立的临时空间

# Install定义如何启动,以及是否开机启动
[Install]
WantedBy=multi-user.target # 当前 Unit 激活时(enable)符号链接目录

启动服务

sudo systemctl daemon-reload
sudo systemctl enable hadoop
sudo systemctl start hadoop
sudo systemctl status hadoop

5.MapReduce 配置

MapReduce 配置文件位于 $HADOOP_HOME/etc/hadoop 目录下:mapred-site.xml、mapred-env.sh

# 添加环境变量
vim /usr/local/hadoop/etc/hadoop/mapred-env.sh

# 设置JDK路径
export JAVA_HOME=/usr/java/jdk1.8.0_361-amd64
# 设置JobHistoryServer进程内存为1GB
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1024
# 设置日志级别为INFO
export HADOOP_MAPRED_LOG_LEVEL=INFO,RFA

配置mapred-site.xml

vim /usr/local/hadoop/etc/hadoop/mapred-site.xml

<configuration>
  <!-- 指定MapReduce程序运行在YARN上 -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>kube-40:10020</value>
    <description>历史服务器通讯端口</description>
  </property>
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>kube-40:19888</value>
    <description>历史服务器Web UI端口</description>
  </property>
  <property>
    <name>mapreduce.jobhistory.admin.address</name>
    <value>kube-40:10033</value>
    <description>历史服务器管理端口</description>
  </property>
  <!-- 历史信息在HDFS的记录临时路径 -->
  <property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>/data/mr-history/tmp</value>
  </property>
  <!-- 历史信息在HDFS的记录最终路径 -->
  <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>/data/mr-history/done</value>
  </property>
  <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  </property>
  <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  </property>
  <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  </property>
</configuration>

6. 启动集群

## 分发hadoop至其他节点
scp -r hadoop-3.3.6 kube-41:`pwd`/
scp -r hadoop-3.3.6 kube-42:`pwd`/
ln -s /usr/local/src/hadoop-3.3.6 /usr/local/hadoop
chown -R hadoop:hadoop /usr/local/hadoop
chown -R hadoop:hadoop /usr/local/src/hadoop-3.3.6

# 各节点操作
ln -s /usr/local/src/hadoop-3.3.6 /usr/local/hadoop
vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
注意 Yarn HA节点配置,需要对rm所在节点,yarn-site.xml文件,yarn.reesourcemanager.ha.id 增加单独配置
# kube-40上增加
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm1</value>
  </property>
# kube-41上增加
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm2</value>
  </property>

启动Zookeeper集群

分别在三台服务器上启动Zookeeper

zkServer.sh start

启动JournalNode

分别在三台服务器上启动JournalNode

hadoop-daemon.sh start journalnode # 已弃用,使用hdfs --daemon start journalnode
hdfs --daemon start journalnode

启动HDFS集群

namenode 主节点上执行初始化操作

hdfs namenode -format

执行初始化后,将namenode主节点上的namenode数据目nn录复制到namenode备节点上

scp -r /ssd2/hadoop/nn/* kube-41:/ssd2/hadoop/nn/

初始化HA状态,任意一台namenode执行即可

hdfs zkfc -formatZK

namenode 主节点上启动HDFS集群

start-dfs.sh

启动YARN集群

start-yarn.sh

启动MapReduce JobHistory Server

mapred --daemon start historyserver
mapred --daemon stop historyserver

验证集群

jps
21025 Jps
11300 NameNode
25476 JournalNode
67639 QuorumPeerMain
16422 NodeManager
42012 JobHistoryServer
15790 ResourceManager
11647 DataNode
13023 DFSZKFailoverController

# web 验证
http://kube-40:50070
http://kube-41:50070

# yarn web验证
http://kube-40:8088/cluster
http://kube-41:8088/cluster

# 验证HDFS,查看leader节点
hdfs haadmin -getAllServiceState
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 如果都是standby,激活一个
hdfs haadmin -transitionToActive --forcemanual nn1
# nn1的状态为standby,nn2的状态为active,可以到nn2的服务器上执行:
hdfs --daemon stop zkfc
hdfs --daemon start zkfc
# 也可以强制性把nn2状态置为standby:
hdfs haadmin -transitionToStandby --forcemanual nn2 #(或kube-41)

# 验证YARN
yarn rmadmin -getAllServiceState
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
# yarn主备切换
yarn rmadmin -transitionToActive --forcemanual rm1
yarn rmadmin -transitionToStandby --forcemanual rm2

## 再次验证hdfs状态
hdfs dfs -mkdir /test
hdfs dfs -ls /
hdfs dfsadmin -report

## namenode 主备切换
hdfs haadmin -transitionToActive --forcemanual nn1
hdfs haadmin -transitionToStandby --forcemanual nn2

## 验证YARN
yarn rmadmin -getServiceState rm1
### **运行计算任务测试**
# 内置的示例MapReduce程序代码
cd /usr/local/hadoop/share/hadoop/mapreduce

# 通过 hadoop jar 命令来运行它,提交MapReduce程序到YARN中
hadoop jar 程序文件 java类名 [程序参数] ... [程序参数]

hadoop fs -mkdir -p /test
hadoop fs -mkdir /output
hadoop fs -put hello.txt /test/

# 运行wordcount程序,统计文件中单词出现的次数
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount hdfs://kube-40:8020/test/ hdfs://kube-40:8020/output/wc1

# 查看结果
hadoop fs -cat /output/wc1/*
hahaha  7
hehehe  6
hello   10

# 删除结果文件
hadoop fs -rm -r /output/wc1

# 提交求圆周率示例程序,蒙特卡罗方法
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 10 100000
参数pi表示要运行的Java类,这里表示运行jar包中的求pi程序
参数10,表示设置几个map任务
参数100000,表示模拟求PI的样本数(越大求的PI越准确,但是速度越慢)

# 查看结果
Job Finished in 18.557 seconds
Estimated value of Pi is 3.14155200000000000000

# 以Python语言实现的求圆周率示例程序,蒙特卡罗方法
import random

def main():
    count = 0
    for i in range(1000000):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        if x * x + y * y <= 1:
            count += 1
    print("Estimated value of Pi is", 4 * count / 1000000)

if __name__ == "__main__":
    main()
### 集群异常处理
## 强制关闭集群脚本
#!/bin/bash
# 停止hadoop进程
hadoop_pids=`ps -ef | grep -v grep | grep -v historyserver | grep apache.hadoop | awk '{print $2}'`
for pid in ${hadoop_pids}
do 
    kill -9 ${pid}
done
## 启动集群
start-all.sh
## 验证集群状态
hdfs dfsadmin -report