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 基础环境搭建
下载:
- https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
- https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
# 准备 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 集群部署
下载:
- https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper
- https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.8.4-bin.tar.gz
# 部署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