索引
文章目录
ps:最后修改与2020年4月16号
init关机
init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的
用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),
init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有
telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐
并且得不到使用shutdown时的信息和等待时间。
克隆centos虚拟机,网卡冲突
当我们克隆centos虚拟机无法正常获取IP地址,重启网卡也提示Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization. [FAILED]
1.这是因为克隆的机器没有正确的mac,UUID信息冲突导致的,首先将/etc/udev/rules.d/70-persistent-net.rules文件清空:
echo "">/etc/udev/rules.d/70-persistent-net.rules
2.然后将网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0的uuid和hwaddr这两行删除:
3.执行reboot命令,重启系统
shell脚本删除文件中的某一行
#!copy/bin/sh
myfile=test.txt
startLine=3
lineCnt=4
let endLine="startLine + lineCnt - 1"
sed -i $startLine','$endLine'd' $myfile
startLine 表示百开始行度的行问号
lineCnt 表示总共答要删除的行数
不固定到行号,比如我要删除带adc字符串的某一行以及后面4行
#!/bin/sh
myfile=test.txt
startLine=`sed -n '/adc/=' $myfile` #先计算带adc字符串行的行号
lineAfter=4
let endLine="startLine + lineAfter"
sed -i $startLine','$endLine'd' $myfile
或者
#!/bin/sh
myfile=test.txt
lineAfter=4
awk -v n=$lineAfter '{if($0~/adc/)for(i=1;i<=n+1;i++)getline;print}' $myfile >tmp
mv -f tmp $myfile
HDFS设计目标
1.自动快速检测应对硬件错误
2.流式访问数据
3.移动计算比移动数据本身更划算
4.简单一致性模型
5.异构平台可移植
HDFS的特点:
优点:
(一)高可靠性: Hadoop按位存储和处理数据的能力值得人们信赖;
(二)高扩展性: Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
(三)高效性: Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
(四)高容错性: Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
缺点:
(一)不适合低延迟数据访问。
(二)无法高效存储大量小文件。
(三)不支持多用户写入及任意修改文件。
集群简介
HADOOP集群 具体来说包含两个集群: HDFS集群和YARN集群, 两者逻辑上分 离,但物理上常在一起
HDFS集群负责海量数据的存储,集群中的角色主要有:
Name Node、 Datanode、 Secondarynamenode
YARN集群负责海量数据运算时的资源调度,集群中的角色主要有
Resourcemanager、 Nodemlanager
我们以3节点为例进行搭建,角色分配如下:
hadoop01 | NameNode | DataNode | ResourceManager |
---|---|---|---|
hadoop02 | SecondaryNameNode | DataNode | NodeManager |
hadoop03 | - | DataNode | NodeManager |
╲ | hadoop01 | hadoop02 | hadoop03 |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
/etc/sysconfig/network | 修改ip地址 |
---|---|
NETWORKING=yes HOSTNAME=hadoop01 hostname=hadoop01 | 192.168.1.30 |
可以共享的文件:
/etc/sysconfig/network (修改部分)并执行hostname 主机名
/etc/sysconfig/network-scripts/ifcfg-eth0 (修改部分)
vi /etc/hosts
/etc/profile
安装Hadoop
安装步骤
linux的环境准备
修改网卡信息 vi /etc/udev/rules.d/70-persistent-net.rules
只在克隆机上操作这一步
1. 修改ip地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.91.3
GATEWAY=192.168.91.2
NETMASK=255.255.255.0
DNS1=8.8.8.8
systemctl restart network
service network restart
2. 改主机映射
- 临时修改:hostname 主机名
- 永久修改:vi /etc/sysconfig/network
- NETWORKING=yes
- HOSTNAME=your_hostname
3. 修改ip映射
- vi /etc/hosts
hadoop01 192.168.1.30
hadoop02 192.168.1.31
hadoop03 192.168.1.32
4. 关闭防火墙
service iptables status
sudo service iptables stop 或
systemctl stop firewalld
#查看防火墙开机启动状态 chkconfig iptables --list
设置防火墙开机不启动 chkconfig iptables off
现在虚拟机内尝试访问hadoop002:50070,如果访问不了,估计是sellinux的问题执行以下命令setenforce 0( 设置为permissive模式)接着重新在虚拟机内访问,此时应该可以正常访问了
临时关闭SELinux:setenforce 0SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。 临时生效: 命令临时生效: setenforce 0 (临时生效可以直接用setenforce 0 ) 1 启用 0 告警,不启用
永久生效: # 操作前先备份 cp /etc/selinux/config /etc/selinux/config.bak cat /etc/selinux/config # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded.
# 更改setlinux级别 sed -i 's/SELINUX=enforcing/\SELINUX=permissive/' /etc/selinux/config ==> vim ``/etc/selinux/config/ --> SELINUX=enforcing[效果同上] # SELINUX参数enforcing代表打开,disabled代表关闭 # 查看selinux状态: getenforce
查看端口是否打开
ss -lp|grep 50070
5. 服务器系统设置
同步时间
法一
#手动同步集群各机器时间
date-s"2017-03-0303:03:03"
法二
#网络同步时间
yum install ntpdate
ntpdate cn.pool.ntp.org 或 ntpdate time.nist.gov
法三
#所有节点安装 chrony 服务。
yum install -y chrony
#Master 节点修改/etc/chrony.conf 文件,注释默认 NTP 服务器,指定上游公共 NTP 服务器,并允许其他节点同步时间。
[root@master ~]# sed -i 's/^server/#&/' /etc/chrony.conf
[root@master ~]# cat >> /etc/chrony.conf << EOF
local stratum 10
server master iburst
allow all
EOF
#Master 节点重重启 chronyd 服务并设为开机启动,开启网络时间同步功能。
[root@master ~]# systemctl enable chronyd && systemctl restart chronyd
[root@master ~]# timedatectl set-ntp true
#Node 节点修改/etc/chrony.conf 文件,指定内网 Master 节点为上游 NTP 服务器,重启服
务并设为开机启动。
[root@node ~]# sed -i 's/^server/#&/' /etc/chrony.conf
[root@node ~]# echo server 10.18.4.33 iburst >> /etc/chrony.conf //IP 为 master 节点地址
[root@node ~]# systemctl enable chronyd && systemctl restart chronyd
所有节点执行 chronyc sources 命令,查询结果中如果存在以“^*”开头的行,即说明已
经同步成功。
# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
==================================================================
^* master 10 6 77 7 +13ns[-2644ns] +/- 13us
法四(推荐)
\1. 时间服务器配置(必须root用户)
(1)检查ntp是否安装
[root@hadoop102 桌面]# rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
(2)修改ntp配置文件
[root@hadoop102 桌面]#vi /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 文件
[root@hadoop102 桌面]# vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
[**root**@hadoop102 桌面]# service ntpd status
ntpd 已停
[**root**@hadoop102 桌面]# service ntpd start
正在启动 ntpd: [确定]
(5)设置ntpd服务开机启动
# chkconfig ntpd on
\2. 其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
[**root**@hadoop103桌面]# crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2)测试,修改任意机器时间
[**root**@hadoop103桌面]# date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步
[**root**@hadoop103桌面]# date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。
设置时区/时间/上海时间
法一
[root@esnode02 ~]# timedatectl set-timezone 'Asia/Shanghai'
[root@esnode02 ~]# date
Mon Apr 8 14:29:12 CST 2019
法二
修改时区
调整时区使用tzselect
[root@lyn ~]# hwclock
Tue 13 Nov 2018 11:52:26 PM AST -0.198205 seconds
[root@lyn ~]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang (except Mohe), Jilin
3) central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
4) most of Tibet & Xinjiang
5) west Tibet & Xinjiang
#? 1
The following information has been given:
China
east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Wed Nov 14 11:52:47 CST 2018.
Universal Time is now: Wed Nov 14 03:52:47 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? 1
You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
注:修改profile文件,添加以下两行:
TZ=‘Asia/Shanghai’;
export TZ
[root@lyn ~]# vim /etc/profile
[root@lyn ~]# source /etc/profile
[root@lyn ~]# date
Wed Nov 14 11:56:16 CST 2018
由此发现,时区由AST 变成了CST。CST :中国标准时间
拓展:修改时间
注:linux系统启动时,系统时间同步硬件时间,如果只修改系统时间,重启后系统时间就会变成硬件时间。
例如,现在要求设置系统时间为2018-11-14 10:45:35
(1),使用date查看系统时间。
[root@lyn ~]# date
Wed Nov 14 18:29:43 CST 2018
(2),查看硬件时间,使用命令hwclock。
[root@lyn ~]# hwclock
Wed 14 Nov 2018 06:29:41 PM CST -0.557725 seconds
(3),调整时间为要求的时间。
方法一:先设置系统时间,再根据系统时间同步硬件时间。
[root@lyn ~]# date -s 11/14/2018
Wed Nov 14 00:00:00 CST 2018
[root@lyn ~]# date -s 10:48:50
Wed Nov 14 10:48:50 CST 2018
[root@lyn ~]# hwclock --systohc ##使用系统时间同步硬件时间
[root@lyn ~]# hwclock
Wed 14 Nov 2018 10:49:33 AM CST -0.756860 seconds
方法二:先设置硬件时间,再根据硬件时间同步系统时间,或者重启系统。
[root@lyn ~]# hwclock --set --date="11/14/2018 10:56:35"
[root@lyn ~]# hwclock
Wed 14 Nov 2018 10:56:44 AM CST -0.709765 seconds
[root@lyn ~]# hwclock --hctosys ##使用硬件时间同步系统时间
[root@lyn ~]# date
Wed Nov 14 10:57:11 CST 2018
6. 配置环境变量
卸载 openjdk
rpm -qa | grep java
rpm e nodeps xxxxxxxxxxxxxxxxxxx
7. 编译 hadoop:
1/程序当中有一部分跟系统环境息息相关(文件读写win还是linux6432)
要结合具体的系统环境下载源码进行编译
2/当需要自定义源码当中的某些组件的时候 需要修改源码 然后要重新编译成安装包
上边是linux的环境准备 下边是hadoop环境配置
修改Hadoop相关配置文件(重点)
1.都要上传jdk,hadoop安装包到/opt/software下,解压
scp /Volumes/zjSD/大二下学期/数据仓库原理与应用/完全分布式搭建全流程/hadoop-2.7.1.tar.gz root@192.168.1.30:/root/data
scp /Volumes/zjSD/大二下学期/数据仓库原理与应用/完全分布式搭建全流程/jdk-8u60-linux-x64.gz root@192.168.1.30:/root/data
tar -zxvf /opt/software/hadoop-2.7.1.tar.gz
tar -zxvf /opt/software/jdk-8u60-linux-x64.gz
环境变量:
/etc/profile
export JAVA_HOME=/opt/software/jdk1.8.0_60
export HADOOP_HOME=/opt/software/hadoop-2.7.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:
source /etc/profile
2.修改配置文件先修改 /hadoop2.7.1/etc/hadoop/hadoop-env.sh
加上JAVA_HOME的路径 /opt/software/jdk1.8.0_60/
sudo cat >> /etc/profile << EOF
JAVA_HOME=/root/data/jdk1.8.0_60
HADOOP_HOME=/root/data/hadoop-2.7.1
PATH=$PATH:/root/data/jdk1.8.0_60/bin:/root/data/hadoop-2.7.1/sbin:/root/data/hadoop-2.7.1/bin
EOF
source /etc/profile
刚定义的变量 不识别,不能引用 刚定义的变量,所以编写时用绝对路径
配置好环境变量后,查看命令是否有效
hadoop -version
出现Error: No command named -version’ was found. Perhaps you meant hadoop version
原因:将hadoop version输成了hadoop -version。Java检验是用java -version 而hadoop是直接输入hadoop version。
单机模式
1 配置hadoop-env.sh
[atguigu@hadoop102 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/root/data/jdk1.8.0_60
键入jps,发现没有进程,正常
hadoop fs -ls /
单机模式下的文件系统,就是本机的文件系统
伪分布式运行模式
预览
hadoop-env.sh
core-site.xml
hdfs-site.xml
(a)配置:hadoop-env.sh
Linux系统中获取JDK的安装路径:
$ echo $JAVA_HOME
/opt/module/jdk1.8.0_144
修改JAVA_HOME 路径:
export JAVA_HOME=/opt/module/jdk1.8.0_144
(b)配置: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-2.7.2/data/tmp</value>
</property>
(c)配置:hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
完全分布式配置
预览
hadoop-env.sh
core-site.xml
hdfs-site.xml
slaves
yarn-env.sh
yarn-site.xml
mapred-env.sh
mapred-site.xml
1 配置hadoop-env.sh
[atguigu@hadoop102 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/root/data/jdk1.8.0_60
2 配置core-site.xml
[atguigu@hadoop01 hadoop]$ vi core-site.xml
tfs://淘宝文件系统
fill://本地文件系统,根据你运行机器(mac或win)上的文件系统动态获得
gfs://谷歌文件系统
在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/data1/hadoopdata/data/tmp</value>
</property>
<!-- 指定bufier的大小 -->
<property>
<name>io. file.buffer.size</name>
<value>4096</value>
</property>
3 配置hdfs-site.xml
[atguigu@hadoop102 hadoop]$ vi hdfs-site.xml
在该文件中编写如下配置
<!--副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop02:50090</value>
</property>
<!-- 指定HDFS块的大小设置,默认128-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>
假设寻址时间为10ms,理想的传输时间是寻址时间的100倍,即10ms/0.01=1000ms=1s.
磁盘的传输速率100MB/s. 所以block大小为1s*100MB/s=100MB
寻址时间 和 传输速率 是固定的。能控制的是传输时间和块的大小。当块的大小确定后,传输时间也就确定了。
结论:影响块大小的是磁盘的传输速率。
</description>
</property>
YARN的配置文件yarn-env.sh
、yarn-site.xml
5 配置yarn-env.sh
[atguigu@hadoop102 hadoop]$ vi yarn-env.sh
export JAVA_HOME=/root/data/jdk1.8.0_60
6 配置yarn-site.xml
[atguigu@hadoop102 hadoop]$ vi 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>
MapReduce的配置文件mapred-env.sh
、mapred-site.xml
7 配置mapred-env.sh
[atguigu@hadoop102 hadoop]$ vi mapred-env.sh
export JAVA_HOME=/root/data/jdk1.8.0_60
8 配置mapred-site.xml
[atguigu@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[atguigu@hadoop102 hadoop]$ vi mapred-site.xml
在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
5.添加从节点(删除原来内容)
群起集群脚本(start-dfs.sh)都需要此配置文件
Vi slaves
hadoop01
hadoop02
hadoop03
分发到其他机器上
注意:检查绝对不能有空格,否者其他脚本读到此文件,也会读到空格
克制虚拟机就不用做这部分了
6.分发安装包
scp -r /opt/software/hadoop-2.7.1/ hadoop02:/opt/software/
scp -r /opt/software/hadoop-2.7.1/ hadoop03:/opt/software/
scp -r /opt/software/jdk1.8.0_60/ hadoop02:/opt/software/
scp -r /opt/software/jdk1.8.0_60/ hadoop03:/opt/software/
7.修改02,03机器上vi /etc/profifile文件并配置HADOOP_HOME,JAVA_HOME
export JAVA_HOME=/opt/software/jdk1.8.0_60
export HADOOP_HOME=/opt/software/hadoop-2.7.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:
source /etc/profile
8.ssh免密登录:
hadoop的群起脚本需要ssh免密登录
安装ssh
yum list | grep ssh 搜索ssh的安装软件包
yum -y install openssh-clients.x86_64 安装ssh客户端(每台机器都需要安装)
生成秘钥
ssh-keygen -t rsa 生成秘钥对
ssh-copy-id hadoop01 将公钥拷贝给其他的机器(其他的机器需要安装ssh)
ssh-copy-id hadoop02
ssh-copy-id hadoop03
注意:在namenode和ResourceManager节点上都要配置免密登录。因为他们要管理其他节点。
9.需要格式化 namenode 在hadoop01
$ bin/hdfs namenode -format
开启hdfs集群
start-dfs.sh
开启yarn集群,(必须在ResourceManager节点上执行,否者报错)
start-yarn.sh
stop-dfs.sh 停止集群
xcall.sh jps 查看集群所有进程
sbin目录下的文件
distribute-exclude.sh start-all.cmd stop-balancer.sh
hadoop-daemon.sh start-all.sh(过时) stop-dfs.cmd
hadoop-daemons.sh start-balancer.sh stop-dfs.sh
hdfs-config.cmd start-dfs.cmd stop-secure-dns.sh
hdfs-config.sh start-dfs.sh stop-yarn.cmd
httpfs.sh start-secure-dns.sh stop-yarn.sh
kms.sh start-yarn.cmd yarn-daemon.sh
mr-jobhistory-daemon.sh start-yarn.sh yarn-daemons.sh
refresh-namenodes.sh stop-all.cmd
slaves.sh stop-all.sh
http://hadoop01:50070/
访问webUi