准备
准备客户机(本例用三台虚拟机CentOS测试)
- 1、配置IP,
- 2,创建用户
- 3,关闭防火墙,禁止开机自启
sudo systemctl stop firewalld
sudo systemctl disable firewalld
- 4、创建/opt/module /opt/software两个目录,注意所属主和所属组
- 5、配置网络,
sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改添加如下内容:
#修改
ONBOOT=yes
BOOTPROTO=static
#添加
IPADDR=192.168.1.101
PREFIX=24
GATEWAY=192.168.1.2
DNS1=192.168.1.2
- 6、修改主机名,便于配置,同时设置通过其他主机名访问IP
#hadoop101是主机名
sudo hostnamectl --static set-hostname hadoop101
#在以下目录中修改IP对应的主机名,例如添加 192.168.1.101 hadoop101
vim /etc/hosts
安装JDK,Hadoop
将java和Hadoop安装包解压(解压到/opt/module下)
配置环境变量
Linux环境变量配置方式
- 1、/etc/profile
- 2、/etc/profile.d/*.sh 创建任何一个 .sh 文件都可以被加载
- 3、~/.bashrc
sudo vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source环境变量
source /etc/profile.d/my_env.sh
测试安装成功
java
java-verson
hadoop
如果没有出现相关信息,重启
集群分发脚本xsync
将其设置在系统中的bin目录下,以便于全局调用
sudo mv xsync /bin/
#!/bin/bash
#xsync
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
#7、rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
SSH无密登录配置
- 生成公钥和私钥(自动生成在根目录的.ssh目录):
ssh-keygen -t rsa
将公钥拷贝到要免密登录的目标机器上,同时也要拷贝到本地机上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
....
hadoop集群配置
注意:NameNode和SecondaryNameNode不要安装在同一台服务器
注意:ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置
将所用的主机配置相关功能
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9820</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 通过web界面操作hdfs的权限 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
<!-- 后面hive的兼容性配置 -->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
</configuration>
hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- Reducer获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量通过从NodeManagers的容器继承的环境属性,对于mapreduce应用程序,除了默认值 hadoop op_mapred_home应该被添加外。属性值 还有如下-->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- 解决Yarn在执行程序遇到超出虚拟内存限制,Container被kill -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 后面hive的兼容性配置 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
</configuration>
mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
workers
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
hadoop102
hadoop103
hadoop104
分发到集群其他成员
在完成之后,注意分发到集群其他成员时的文件要统一,data中的内容不能分发,NameNode的主机data中有NameNode的文件
xsync /opt/module/hadoop-3.1.3/etc
格式化NameNode
- 如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
- 格式化只能一次,
hdfs namenode -format
开启hdfs
#在hadoop3下开启(yarn的配置在hadoop2中)
#整体开启hdfs
start-dfs.sh
开启yarn
#在hadoop3下开启(yarn的配置在hadoop3中)
#整体开启yarn
start-yarn.sh
各服务逐一启动停止
#(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
#(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
在windows上访问页面
http://hadoop102:9870
http://hadoop103:8088
http://hadoop104:9868
配置历史服务器
vi mapred-site.xml中添加
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
完成之后注意分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
在hadoop102启动历史服务器
mapred --daemon start historyserver
在网页端查看
http://hadoop102:19888
配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
vim yarn-site.xml下
#在该文件里面增加如下配置。
<!-- 开启日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 访问路径-->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 保存的时间7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2)分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3)关闭NodeManager 、ResourceManager和HistoryServer
#在103上执行:
stop-yarn.sh
#在102上执行:
mapred --daemon stop historyserver
4)启动NodeManager 、ResourceManage、Timelineserver和HistoryServer
#在103上执行
start-yarn.sh
yarn --daemon start timelineserver
#在102上执行:
mapred --daemon start historyserver
5)删除HDFS上已经存在的输出文件
hdfs dfs -rm -R /user/atguigu/output
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
1)时间服务器配置(必须root用户)
(1)在所有节点关闭ntp服务和自启动
sudo systemctl stop ntpd
sudo systemctl disable ntpd
(2)修改ntp配置文件
sudo vim /etc/ntp.conf
修改内容如下
- a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
改为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
- b)修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
#修改为:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
sudo vim /etc/sysconfig/ntpd
#增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
systemctl start ntpd
(5)设置ntpd服务开机启动
systemctl enable ntpd
2)其他机器配置(必须root用户)
ntpdate hadoop102 //跟新时间到hadoop2
在其他机器配置10分钟与时间服务器同步一次
crontab -e
#编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
添加白名单
在hdfs-site.XML文件中添加如下信息。
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
在/opt/module/hadoop-3.1.3/etc/hadoop目录下新建whitelist文件,存放名单IP信息
添加黑名单
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>
注意:不允许白名单和黑名单中同时出现同一个主机名称
DataNode多目录配置
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
${hadoop.tmp.dir}:在core-site.xml文件下
配置多队列的容量调度器
默认Yarn的配置下,容量调度器只有一条Default队列。在capacity-scheduler.xml中可以配置多条队列,并降低default队列资源占比:
先关闭yarn(stop-yarn.sh),配置完成分发,重启
capacity-scheduler.xml中修改
<!-- 红色是修改的部分 -->
<property>
<name>yarn.scheduler.capacity.root.queues
</name>
<!--添加hive队列-->
<value>default,hive</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<property>
<!--降低default所占资源占比-->
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>40</value>
</property>
添加如下内容,
<!-- 同时为新加队列添加必要属性:-->
<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
<value>-1</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
<value>-1</value>
</property>
开启集群数据均衡
节点间数据均衡
#开启数据均衡
start-balancer.sh -threshold 10
#停止数据均衡命令:
stop-balancer.sh
于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执行start-balancer.sh,而是找一台比较空闲的机器。
磁盘间数据均衡
- (1)生成均衡计划(我们只有一块磁盘,不会生成计划)
hdfs diskbalancer -plan hadoop103
- (2)执行均衡计划
hdfs diskbalancer -execute hadoop103.plan.json
- (3)查看当前均衡任务的执行情况
hdfs diskbalancer -query hadoop103
- (4)取消均衡任务
hdfs diskbalancer -cancel hadoop103.plan.json
配置LZO压缩
hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需依赖hadoop和lzo进行编译,
lzo的优势:压缩包可以支持切片
- 1、将编译过后的jar包:hadoop-lzo-0.4.20.jar 放入hadoop/share/hadoop/common/目录下
- 2、同步到集群其他机器上
- 3、core-site.xml增加配置支持LZO压缩
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<!--注意同步到其他机器上-->
创建索引
hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.DistributedLzoIndexer 压缩文件.lzo
集群性能测试
#测试写性能
hadoop jar /hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles cpu核数-1 -fileSize 128MB
#测试读性能
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles cpu核数-1 -fileSize 128MB
- Number of files:生成mapTask数量,一般是集群中CPU核数-1,为了保障一个cpu作为ApplicationMaster
- Total MBytes processed:单个map处理的文件大小
Throughput mb/sec:
计算方式:处理的总文件大小/每一个mapTask写数据的时间累加
集群整体吞吐量:生成mapTask数量*单个mapTak的吞吐量
- Average IO rate mb/sec::单个mapTak的吞吐量
计算方式:每个mapTask处理文件大小/每一个mapTask写数据的时间 累加/生成mapTask数量
- IO rate std deviation:方差、反映各个mapTask处理的差值,越小越均衡
挂载
mount [-t 文件系统类型] [-o 挂载类型] device 目标文件
-t vfstype
1、光盘或光盘镜像:iso9660
2、DOS fat16文件系统:msdos
3、Windows 9x fat32文件系统:vfat
4、Windows NT ntfs文件系统:ntfs
5、Mount Windows文件网络共享:smbfs
6、UNIX(LINUX) 文件网络共享:nfs
挂载类型
1、loop:用来把一个文件当成硬盘分区挂接上系统
2、ro:采用只读方式挂接设备
3、rw:采用读写方式挂接设备
4、iocharset:指定访问文件系统所用字符集
例如: