之前一直在windows上,通过VMware软件搭建hadoop集群,尝试过使用docker进行搭建,在 Windows 环境下跑程序,需要winutils.exe ,hadoop.dll 遇到了种种问题。本着尝试的原则使用了黑苹果。搭建后的问题都没有啦。总算是解决了环境的问题。下面就记录下。
准备
VMware Fusion:虚拟机
Termius:连接虚拟机,mac自带的终端也不错
Transmit:ftp连接虚拟机
软件工具包:
java8-linux.tar.gz
Hadoop3.2.1.tar.gz
CentOS 镜像文件
虚拟机安装CentOS
推荐先创建一个CentOS,配置好下面的所有内容(包括hadoop的安装)后,再克隆出3份。
使用VMwae Fusion 创建CentOS的虚拟机,之后要克隆2个,我要搭建完全分布式。
修改ip地址为静态IP
修改主机名分别为 hadoop01, hadoop02, hadoop03
关闭防火墙和selinux (自己学习为了简单)
Yum 换国内源 ,安装 vim, tree, net-tools等常用工具
配置ssh免密登录
1 2 3 4 $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys ssh localhost(首次需输入yes )
搭建集群 安装java环境
使用Transmit或SFTP工具上传java文件到目录下,tar -zxvf XXX -C /usr/local/
解压。
在/etc/profile
下配置JAVA_HOME
。
1 2 export JAVA_HOME=/usr/local/jdk1.8.0_221 export PATH=$JAVA_HOME/bin:$PATH
安装hadoop
使用Transmit工具上传hadoop文件到目录下,tar -zxvf XXX -C /usr/local/
解压。
在/etc/profile
下配置HADOOP_HOME
。
1 2 export HADOOP_HOME=/usr/local/hadoop3.2.1 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
测试 hadoop -version,之后就是配置hadoop的配置文件
这里先提前解决启动错误,我搭建的时候没有添加export环境变量。启动的时候出现如下的错误:
1 2 3 4 5 6 7 8 9 10 [root@hadoop01 ~]# $HADOOP_HOME/sbin/start-dfs.sh Starting namenodes on [hadoop01] ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes ERROR: Attempting to operate on hdfs datanode as root ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation. Starting secondary namenodes [hadoop01] ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
解决在 hadoop-env.sh 下添加环境变量
hadoop-env.sh
打开注释,修改JAVA_HOME的路径
1 2 3 4 5 6 7 export JAVA_HOME=/usr/local/java1.8 # 解决上面出现的错误,放置开头 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"
core-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 <configuration> <!-- 指定hdfs的nameservice为ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration>
hdfs-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <configuration> <!-- Configurations for NameNode: --> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/hdfs/name/</value> </property> <property> <name>dfs.blocksize</name> <value>268435456</value> </property> <property> <name>dfs.namenode.handler.count </name> <value>100</value> </property> <!-- Configurations for DataNode: --> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/hdfs/data/</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
yarn-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <configuration> <!-- Site specific YARN configuration properties --> <!-- Configurations for ResourceManager and NodeManager: --> <!-- Configurations for ResourceManager: --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> <!-- 配置外网只需要替换外网ip为真实ip,否则默认为 localhost:8088 --> <!-- <property> <name>yarn.resourcemanager.webapp.address</name> <value>外网ip:8088</value> </property> --> <!-- Configurations for NodeManager: --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- Configurations for History Server (Needs to be moved elsewhere): --> </configuration>
mapred-site.xml 1 2 3 4 5 6 7 <configuration> <!-- Configurations for MapReduce Applications: --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
workers
常用的配置文件中的重要参数。 etc/hadoop/core-site.xml
参数
值
说明
fs.defaultFS
NameNode URI
hdfs://host:port/
io.file.buffer.size
131072
队列文件中的读/写缓冲区的大小。
etc/hadoop/hdfs-site.xml
参数
值
说明
dfs.namenode.name.dir
NameNode持久存储名称空间和事务日志的本地文件系统上路径
如果这是一个逗号分隔的目录列表,那么将在所有目录中复制名称的表,以进行冗余。
dfs.hosts / dfs.hosts.exclude
包含/摒弃的数据存储节点清单
如果有必要,使用这些文件来控制允许的数据存储节点列表
dfs.blocksize
268435456
HDFS 块大小为256MB的大文件系统.
dfs.namenode.handler.count
100
多个NameNode服务器线程处理来自大量数据节点的rpc。
参数
值
说明
dfs.datanode.data.dir
DataNode的本地文件系统上存储块的逗号分隔的路径列表。
如果这是一个逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常在不同的设备上。
etc/hadoop/yarn-site.xml
参数
值
说明
yarn.acl.enable
true / false
允许ACLs?默认 false.
yarn.admin.acl
Admin ACL
在集群上设置adminis。 ACLs are of for comma-separated-usersspacecomma-separated-groups.默认是指定值为*表示任何人。特别的是空格表示皆无权限。
yarn.log-aggregation-enable
false
Configuration to enable or disable log aggregation配置是否允许日志聚合。
参数
值
说明
yarn.resourcemanager.address
ResourceManager host:port 用于客户端任务提交.
如果设置host:port ,将覆盖yarn.resourcemanager.hostname.host:port主机名。
yarn.resourcemanager.scheduler.address
ResourceManager host:port 用于应用管理者向调度程序获取资源。
如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名
yarn.resourcemanager.resource-tracker.address
ResourceManager host:port 用于NodeManagers.
如果设置host:port ,将覆盖yarn.resourcemanager.hostname的主机名设置。
yarn.resourcemanager.admin.address
ResourceManager host:port 用于管理命令。
如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名的设置
yarn.resourcemanager.webapp.address
ResourceManager web-ui host:port.
如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名的设置
yarn.resourcemanager.hostname
ResourceManager host.
可设置为代替所有yarn.resourcemanager* address 资源的主机单一主机名。其结果默认端口为ResourceManager组件。
yarn.resourcemanager.scheduler.class
ResourceManager 调度类.
Capacity调度 (推荐), Fair调度 (也推荐),或Fifo调度.使用完全限定类名,如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.
yarn.scheduler.minimum-allocation-mb
在 Resource Manager上为每个请求的容器分配的最小内存.
In MBs
yarn.scheduler.maximum-allocation-mb
在Resource Manager上为每个请求的容器分配的最大内存
In MBs
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path
允许/摒弃的nodeManagers列表
如果必要,可使用这些文件来控制允许的NodeManagers列表
参数
值
说明
yarn.nodemanager.resource.memory-mb
用于给定的NodeManager的资源,即可用的物理内存、内存容量。
用于运行容器的NodeManager上的全部可用资源定义。
yarn.nodemanager.vmem-pmem-ratio
任务可使用的虚拟内存的最大比率,可能超过物理内存限制。
每个任务的虚拟内存使用可能超过其物理内存限制。NodeManager上的任务所使用的虚拟内存总量可能会超过其物理内存使用量。
yarn.nodemanager.local-dirs
写中间数据的本地文件系统以逗号分隔的路径列表。
多个路径帮助扩展磁盘i/o。
yarn.nodemanager.log-dirs
写日志的本地文件系统以逗号分隔的路径列表
多个路径帮助扩展磁盘i/o。
yarn.nodemanager.log.retain-seconds
10800
默认时间(以秒为单位)保留NodeManager上的日志文件,仅适用于禁用日志聚合的情况。
yarn.nodemanager.remote-app-log-dir
/logs
在应用程序完成时移动应用程序日志的HDFS目录。需要设置相应的权限。仅适用于启用日志聚合的情况
yarn.nodemanager.remote-app-log-dir-suffix
logs
后缀附加到远程日志目录。日志将聚合到{yarn.nodemanager.remote-app-log-dir}/yarn.nodemanager.remote−app−log−dir/{user}/${thisParam}仅适用于启用日志聚合的情况
yarn.nodemanager.aux-services
mapreduce_shuffle
Shuffle service that needs to be set for Map Reduce applications.需要被设置Shuffle服务的Map Reduce应用程序
yarn.nodemanager.env-whitelist
环境变量通过从NodeManagers的容器继承的环境属性
对于mapreduce应用程序,除了默认值hadoop op_mapred_home应该被添加外。属性值还有JAVA_HOME HADOOP_COMMON_HOME、HADOOP_HDFS_HOME HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME HADOOP_MAPRED_HOME
History Server (需要转移到其他地方)配置:
参数
值
说明
yarn.log-aggregation.retain-seconds
-1
保存多长时间之后删除聚合日志。-1禁用。要小心,设置值这个太小,这个节点将成为垃圾箱。
yarn.log-aggregation.retain-check-interval-seconds
-1
检查聚合日志保留的间隔时间。如果将值设置为0或负值,则将值计算为聚合日志保留时间的十分之一。要小心,设置这个太小,这个节点将成为垃圾箱。
etc/hadoop/mapred-site.xml
参数
值
说明
mapreduce.framework.name
yarn
设置执行的框架为 Hadoop YARN.
mapreduce.map.memory.mb
1536
Maps的资源限制
mapreduce.map.java.opts
-Xmx1024M
Maps的子jvm的堆大小设置
mapreduce.reduce.memory.mb
3072
Reduces的资源限制
mapreduce.reduce.java.opts
-Xmx2560M
reduces的子jvm的堆大小设置
mapreduce.task.io.sort.mb
512
更高的内存限制,同时对数据进行排序以提高效率。
mapreduce.task.io.sort.factor
100
在排序文件时,同时合并更多的流。
mapreduce.reduce.shuffle.parallelcopies
50
reduce通过运行更多的并行副本来取得大量的maps的输出结果
MapReduce JobHistory Server配置:
参数
值
说明
mapreduce.jobhistory.address
MapReduce JobHistory 服务 主机:端口
默认端口为 10020.
mapreduce.jobhistory.webapp.address
MapReduce JobHistory Server Web UI 主机:端口
默认端口为19888.
mapreduce.jobhistory.intermediate-done-dir
/mr-history/tmp
MapReduce jobs写历史文件的目录
mapreduce.jobhistory.done-dir
/mr-history/done
MR JobHistory Server管理的历史文件目录
NodeManagers健康监控
Hadoop提供了一种管理员可以通过配置NodeManager以便定期运行管理员提供的脚本,确定节点是否健康的机制。
管理员可以通过他们选择的脚本中的任一检查来确定节点是否处于健康状态。
如果脚本检测到节点处于不健康状态,它必须打印一行以ERRO开始的字符串并进行标准输出。
NodeManager会周期性地生成脚本并检查它的输出。如果脚本的输出包含字符串ERROR错误,如上所述,该节点的状态是不健康的,并且该节点将由ResourceManager在黑名单上列出来。并且将不会有新的任务分配给此节点
无论如何,NodeManager还将继续运行此脚本,这样如果此节点恢复正常,它就会自动从ResourceManager上的黑名单节点中删除。该节点的健康信息将伴随脚本进行输出,(如果是不健康的),并通过ResourceManager web界面提供给管理员。该节点健康的时间也会显示在web界面上。
可以使用以下参数来控制etc/hadoop/yarn-site.xml中的节点健康监控脚本信息
参数
值
说明
yarn.nodemanager.health-checker.script.path
节点健康脚本
检查节点的健康状态。.
yarn.nodemanager.health-checker.script.opts
节点健康脚本选项
用于检查节点健康状态的脚本选项。
yarn.nodemanager.health-checker.interval-ms
节点健康脚本间隔时间
运行健康脚本的时间间隔。
yarn.nodemanager.health-checker.script.timeout-ms
节点健康脚本超时间隔。
用于健康脚本执行的超时。.
如果只有一些本地磁盘变得糟糕,那么health checker脚本不会出现ERROR错误信息。
NodeManager有能力定期检查本地磁盘的健康状况(特别是检查NodeManager -local-dirs和NodeManager -log-dirs),并且在达到了基于配置属性yarn.nodemanager.disk-health-checker的值设置的坏目录的阈值之后。如果整个节点都是不健康的,这个信息将被发送到资源管理器。由健康检查脚本来标识引导磁盘被检查还是引导磁盘上出现故障。
Web 界面说明 如果Hadoop集群启动并运行web ui组件进行检查,其如下所述:
守护进程
Web界面
说明
NameNode
http://nn_host:port/
默认HTTP端口为 9870
ResourceManager
http://rm_host:port/
默认HTTP端口为8088
MapReduce JobHistory Server
http://jhs_host:port/
默认HTTP端口为19888
Hadoop机架感知 许多Hadoop组件都是机架感知的,并利用网络拓扑来实现性能和安全性。Hadoop守护进程通过调用管理员配置的模块获取集群中工作人员的机架信息。有关更详细的信息,请参阅“机架感知 ”文档。
在启动HDFS之前,强烈建议配置机架感知。
日志 Hadoop使用Apache Commons日志框架的Apache log4j进行日志记录。
编辑the etc/hadoop/log4j.properties 文件来实现Hadoop守护进程日志配置(日志格式等)的定制化。
Hadoop集群操作 一旦完成所有必要的配置之后,将文件分发到所有机器上的HADOOP_CONF_DIR目录。这在所有机器上的目录是相同的。
正常情况下,建议将HDFS和YARN使用单独的用户运行。在大多数的安装情况中,HDFS 进程使用‘hdfs’账号,YARN 通常使用 ‘yarn’ 账号。
Hadoop启动
启动HDFS
格式化:启动Hadoop集群,您需要启动HDFS和YARN集群。
第一次打开HDFS时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs :
1 [hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
在指定的节点上使用以下命令启动HDFS NameNode作为hdfs :
1 [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
在每个指定节点上使用以下命令启动一个HDFS DataNode作为hdfs :
1 [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
如果etc/hadoop/workers和ssh可信访问已配置,那么所有的HDFS进程都可以使用一个通用脚本启动hdfs :
1 [hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
启动YARN集群
用下面的命令启动YARN,在指定的ResourceManager上运行YARN:
1 [yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
运行一个脚本,在每个指定的主机上启动一个NodeManager作为yarn :
1 [yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
启动一个独立的WebAppProxy服务器。作为运行在WebAppProxy服务器上的yarn 。如果在负载均衡中使用多个服务器,则应该在每个服务器上运行:
1 [yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
如果etc/hadoop/workers和ssh可信访问被配置,那么所有的线程进程都可以从一个通用脚本开始yarn 。
1 [yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
使用下面的命令启动MapReduce JobHistory服务,运行指定的mapred服务:
1 [mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
Hadoop关闭
sbin/stop-all.sh
关闭HDFS
用下面的命令停止在指定的NameNode上运行hdfs:
1 [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
1 [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
如果etc/hadoop/workers和ssh可信访问被配置,那么所有的HDFS进程都可以用一个通用脚本停hdfs:
1 [hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
关闭Yarn集群
使用下面的命令停止在指定的ResourceManager上运行yarn :
1 [yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
运行一个脚本,以停止yarn 的NodeManager工作:
1 [yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果etc/hadoop/workers和ssh可信访问被配置,那么所有的yarn 进程都可以用一个通用脚本停止:
1 [yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
停止WebAppProxy服务。运行在WebAppProxy服务上的yarn 。如果在负载均衡中使用多个服务,则应该在每个服务器上运行停止WebAppProxy服务:
1 [yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
使用以下命令停止在指定的服务上运行mapred的MapReduce JobHistory服务:
1 [mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver