hadoop学习笔记(持续更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39776901/article/details/79811521

—-2018-04-04—-
alias cle=clear #别名 用cle代替clear
unalias cle #取消cle别名

#上面只是临时性的,永久修改↓

vi ~/.bashrc
source ~/.bashrc #文件中加入

cd - #回退到上一次所在位置
cd .. #回到上一层目录 cd ../..

service iptables status #查看防火墙状态
service iptables stop #关闭防火墙
service iptables start #打开防火墙

cat /etc/inittab

chkconfig iptables –list
chkconfig iptables off #永久关闭防火墙
chkconfig iptables on #永久开启防火墙

service network status/start/stop/restart #网卡状态/启动/停止/重启

tar -zcvf 压缩
tar -zxvf 解压缩

visudo -f /etc/sudoers sudoer的配置

—-2018-04-05—-

Linux下软件的安装大概可分为以下几种:
二进制程序的安装(最简单安装)
rpm程序安装(后缀名为*.rpm)
yum在线安装(本质也是rpm安装,它只是rpm的一种安装方式而已)
源码安装

vi /etc/profile #配置全局环境变量
#最后一行加入

 #my settings
JAVA_HOME=/usr/local/jdk1.7.0_79/
PATH=$PATH:$JAVA_HOME/bin:

rpm -ivh … #安装
rpm -Uvh … #更新
-q :query 查询
-l :list
-e :erase 删除
–nodeps :不检查依赖性强制安装或者删除
–prefix :指定安装路径
-Vp :检测

Linux连接公网
四要素:ip 子网掩码 网关 dns
1、vi /etc/hosts
#最后一行加入
192.168.87.111 hadoop www.hadoop.com
2、vi /etc/sysconfig/network
#修改主机名
3、vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.87.111
PREFIX=24
GATEWAY=192.168.87.2
DNS1=192.168.87.2

yum info gcc #显示安装包信息gcc
yum list #显示所有已经安装和可以安装的程序包
yum list gcc
yum grouplist
yum groupinfo ‘Development tools’

yum [-y] install gcc
yum update gcc #更新指定程序包gcc
yum upgrade gcc #升级制定程序包gcc

yum [-y] remove/erase gcc #删除卸载程序包gcc
yum deplist gcc #查看程序gcc依赖情况

yum clean packages #清除缓存目录下的软件包
yum clean headers #清除缓存目录下的headers
yum clean oldheaders #清除缓存目录下旧的headers
yum clean,yum clean all(= yum clean packages;yum clean oldheaders)清除缓存目录下的软件包及旧的headers
yum makecache #重新构建缓存

yum源 /etc/yum.repos.d/
在线默认yum源 /etc/yum.repos.d/CentOS-Base.repo
本地源 /etc/yum.repos.d/CentOS-Medis.repo

/mnt/hgfs #共享文件夹
mount -o loop /mnt/hgfs/CentOS….. /media/centos

bashdb

tar -zxvf bashdb… -C /usr/local
cd /usr/local/bashdb…
./configure [–prefix]
make & make install

rpm info nginx
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx

service nginx start

vi /etc/nginx/nginx.conf
vi /etc/nginx/conf.d/default.conf
vi /usr/share/nginx/html/demo.html

this is my nginx

shell编程 Linux命令的集合

#!/bin/bash
echo 'hello world'

:wq

chmod 744 ./firstshell

./firstshell
/bin/bash ./firstshell
hello world

变量
eg:

#!/bin/bash
class='1701A'
echo $class

:wq
/bin/bash ./varible.sh
1701A

规则:
变量名和等号之间不能有空格
首个字符必须是字母
中间不能有空格,可以使用下划线
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)

eg:

#!/bin/bash
class=`expr 3 + 3`
echo $class ${class}

:wq
/bin/bash ./varible.sh
6 6

eg:

#!/bin/bash
class='1701A_'
echo 'class is $classclass'

:wq
/bin/bash ./varible.sh
class is

eg:

#!/bin/bash
class='1701A_'
echo "class is ${class}class"

:wq
/bin/bash ./varible.sh
class is 1701A_class

eg:

#!/bin/bash
class='1701A_'
echo 'class is ${class}class'

:wq
/bin/bash ./varible.sh
class is ${class}class

eg:

#!/bin/bash
class='1701A_'
readonly class  #只读变量
class='1702A_'
echo ${class}

:wq
/bin/bash ./varible.sh
varible.sh: line 5: class: readonly variable
class is 1701A_class

eg:

#!/bin/bash
class='1702A_'
unset class #删除变量
echo "class is ${class}class"

:wq
/bin/bash ./varible.sh
class is class

变量类型
1、局部变量
2、环境变量
3、shell变量

shell字符串
双引号中会识别内部的转义符
单引号中会统一认为是字符串

反引号
shell认为反引号中是Linux的可执行命令

取字符串长度

#!/bin/bash
class="1701A_"
echo ${#class}

:wq
/bin/bash ./varible.sh
6

截取字符串

#!/bin/bash
class='this is class of 1701A'
echo ${class:8:5}  #从0开始数,第8个字符往后数5个,即取class

:wq
/bin/bash ./varible.sh
class

查找字符串(角标从1开始,子字符串第一次出现的位置)

#!/bin/bash
class='this is class of 1701A'
echo `expr index "$class" is`

:wq
/bin/bash ./varible.sh
3

#!/bin/bash
class='this is class of 1701A'
echo `expr index "$class" ass`

:wq
/bin/bash ./varible.sh
4

解释:指class后面的字符串ass中任意一个字符(a或者s)第一次出现在句子中的位置,首先出现的是s,所以输出是4

shell数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小,角标从0开始

eg:

#!/bin/bash
arr1=(1 2 3 4 'hello' 'world')
echo arr1

:wq
/bin/bash array.sh
arr1

eg:

#!/bin/bash
arr1=(1 2 3 4 'hello' 'world')
echo ${arr1[*]}	#或者echo ${arr1[@]} 取所有值

:wq
/bin/bash array.sh
1 2 3 4 hello world

越界不报错,取空值

echo $(#arr1)  #取第一个值的长度
echo $(#arr1[@])#取数组的长度

shell注释 用#进行单行注释
没有多行注释

shell基本运算符
一、算数运算符

#!/bin/bash
a=20
b=10
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`  #乘法要用转义符
echo `expr $a / $b`
echo `expr $a % $b`

二、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

-eq 检测两个数是否相等,相等返回true
-ne 检测两个数是否相等,不相等返回true
-gt 检测左边的数是否大于右边的,如果是,返回true
-lt 检测左边的数是否小于右边的,如果是,返回true
-ge 检测左边的数是否大于等于右边的,如果是,返回true
-le 检测左边的数是否小于等于右边的,如果是,返回true
#!/bin/bash
a=20
b=10
if [ $a -eq $b ]
then
echo "$a == $b"
fi
if [ $a -gt $b ]
then
echo "$a > $b"
fi
if [ $a -ge $b ]
then
echo "$a >= $b"
fi
if [ $a -le $b ]
then
echo "$a <= $b"
fi
if [ $a -eq $b ]
then
echo "$a ne $b"
fi
if [ $a -ne $b ]
then
echo "$a != $b"
fi

:wq
/bin/bash ./al.sh
20 > 10
20 >= 10
20 != 10

三、布尔运算符
-o or
-a and

#!/bin/bash
a=20
b=10
if [ $a -eq $b -o $a -ge $b ]
then
echo "$a == $b or $a >= $b"
fi
if [ $a -gt $b -a $a -eq $b ]
then
echo "$a > $b and $a == $b"
fi
if [ $a -ge $b ]
then
echo "$a >= $b"
fi
if [ $a -le $b ]
then
echo "$a <= $b"
fi
if [ $a -eq $b ]
then
echo "$a ne $b"
fi
if [ $a -ne $b ]
then
echo "$a != $b"
fi

:wq
/bin/bash ./al.sh
20 == 10 or 20 >= 10
20 >= 10
20 != 10

四、字符串运算符
= 检测两个字符串是否相等,相等返回true
!= 检测两个字符串是否相等,不想等返回true
-z 检测字符串长度是否为0,为0返回true
-n 检测字符串长度是否为0,不为0返回true
str 检测字符串是否为空,不为空返回true

eg:

#!/bin/bash
a='this'
b='this'

if [ $a = $b ]
then
echo "$a == $b"
fi


if [ $a != $b ]
then
echo "$a != $b"
fi


if [ -z $a ]
then
echo "$a is 0"
fi

if [ -n $a ]
then
echo "$a is not 0"
fi

if [ $b ]
then
echo "$a is not null"
fi

:wq
/bin/bash ./al.sh
this == this
this is not 0
this is not null

五、文件测试运算符 用户检测Linux文件的各种属性

-b file     检测文件是否是块设备文件,如果是,返回true
-c file     检测文件是否是字符设备文件,如果是,返回true
-d file     检测文件是否是目录,如果是,返回true
-f file     检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,返回true
-g file     检测文件是否设置了SGID位,如果是,返回true
-k file     检测文件是否设置了粘着位(Sticky Bit),如果是,返回true
-p file     检测文件是否是具名管道,如果是,返回true
-u file     检测文件是否设置了SUID位,如果是,返回true
-r/w/x file 检测文件是否可读/可写/可执行,如果是,返回true
-s file     检测文件是否为空(文件大小是否大于0),如果是,返回true
-e file     检测文件(包括目录)是否存在,如果是,返回true

eg:

#!/bin/bash
file='/home/shell/firstshell'

if [ -r $file ]
then
echo "可读"
fi

if [ -x $file ]
then
echo "可执行"
fi

if [ -f $file ]
then
echo "is file"
fi

if [ -d $file ]
then
echo "is directory"
fi

if [ -s $file ]
then
echo "file is not null"
fi

if [ -e $file ]
then
echo "file is exist"
fi

:wq
/bin/bash ./al.sh
可读
is file
file is not null
file is exist

条件控制
eg:

#!/bin/bash

a=20
b=10
c=15

if [ $a -gt $b ]
then
echo "$a > $b"
fi

if [ $a -lt $b ]
then
echo "$a < $b"
else
echo "$a is not smaller than $b"
fi


if [ $a -lt $b ]
then
echo "$a < $b"
elif [ $a -gt $b -a $b -lt $c ]
then
echo "$a > $b and $b < $c"
else
echo "$a < $b"
fi

:wq
/bin/bash ./if.sh
20 > 10
20 is not smaller than 10
20 > 10 and 10 < 15

写成一行就得这么写:if [ ];then echo “”;fi

循环 for while until

for循环
eg:

for val in `seq 1 20`
do
echo "the value is:"$val
done

:wq
/bin/bash ./for.sh
the value is:1
the value is:2
the value is:3
the value is:4
the value is:5
the value is:6
the value is:7
the value is:8
the value is:9
the value is:10
the value is:11
the value is:12
the value is:13
the value is:14
the value is:15
the value is:16
the value is:17
the value is:18
the value is:19
the value is:20

循环创建文件

for i in `seq 1 20`
do
touch "/home/shell/${i}.log"
done

while循环
eg:

#!/bin/bash
i=1
while(($i < 21))
do
echo "the value is:"$i
i=`expr $i + 1` #或者let "i++"
done

:wq
/bin/bash ./while.sh

case匹配:
(必须有in,一个模式结束必须用双;;号,esac整个case结束标识)
eg:

#!/bin/bash
while :   #冒号前有空格
do
echo "请您输入一个1-5之间的数字:"
read anum
case $anum in
1|2|3|4|5)
echo "恭喜您,您输入的数字:$anum 在1-5之间"
break
;;
*)
echo "您输入的数字为:${anum},数字不在1-5之间,请再次输入:"
continue
;;
esac
done

shell中的方法
定义如下:

[function] funname()
{
    action;
    [return int;]
}

注:
1、可以带function fun()定义,也可以直接fun()定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

eg:

#!/bin/bash
function fun1()
{
    echo "this is my first function"
}

#调用方法
echo "调用方法之前..."
fun1
echo "调用方法之后..."

:wq
/bin/bash ./firstfunc.sh
调用方法之前…
this is my first function
调用方法之后…

eg:

#!/bin/bash
fun1()
{
    echo "请输入两个数字,我们将为你计算和"
    echo "请输入一个数字:"
    read anum
    echo "请输入第二个数字:"
    read bnum
    return $(($anum + $bnum))
}

fun1
echo "您输入的两个数之和为:"$?	#$?取上一行方法的返回值

:wq
/bin/bash ./withReturn
请输入两个数字,我们将为你计算和
请输入一个数字:
1
请输入第二个数字:
2
您输入的两个数之和为:3

eg:

#!/bin/bash
fun1()
{
    echo "第一个参数"$1
    echo "第二个参数"$2
    echo "第九个参数"$9
    echo "第十个参数"$10    #参数个数大于两位数的时候要加花括号,否则这里只取10
    echo "第十个参数"${10}
    echo "所有参数"$*
    echo "参数个数"$#
}

fun1 1 2 3 4 5 6 7 8 100 900

:wq
/bin/bash ./withParams.sh
第一个参数1
第二个参数2
第九个参数100
第十个参数10
第十个参数900
所有参数1 2 3 4 5 6 7 8 100 900
参数个数10

eg:

#!/bin/bash
echo '命令端传递过来的所有参数:'$0
echo '命令端传递过来的第一个参数:'$1
echo '命令端传递过来的第二个参数:'$2
echo '命令端传递过来的参数个数:'$#

:wq
/bin/bash ./wpar.sh
[root@lingfengji shell]# ./wpar.sh 100 20 50 99
命令端传递过来的所有参数:100 20 50 99
命令端传递过来的第一个参数:100
命令端传递过来的第二个参数:20
命令端传递过来的参数个数:4

$# 传递到脚本的参数个数
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数。 
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。

shell文件引入
eg:

#1.sh
#!/bin/bash
class=1701A
name=zhangsan
function fun1()
{
    echo "i am in 1.sh"
}

:wq
#2.sh
#!/bin/bash
source /home/shell/1.sh  #或者./home/shell/1.sh
echo $class
echo $name
fun1

:wq
/bin/bash ./2.sh
1701A
zhangsan
i am in 1.sh

shell中脚本的简单调试
1、shell语法检测:
sh -n ./test.sh (sh是/bin/sh 是系统提供的可执行脚本)
2、shell的普通测试:
sh -x ./test.sh

eg:

#!/bin/bash

echo "welcome to shell debug"
for i in 1 2 3 4 5 6
echo $i      #少写一个do
done

:wq
sh -n ./test.sh
./test.sh: line 5: syntax error near unexpected token echo'
./test.sh: line 5:
echo $i’

改正后没有问题

sh -x ./test.sh

  • echo ‘welcome to shell debug’
    welcome to shell debug
  • for i in 1 2 3 4 5 6
  • echo 1
    1
  • for i in 1 2 3 4 5 6
  • echo 2
    2
  • for i in 1 2 3 4 5 6
  • echo 3
    3
  • for i in 1 2 3 4 5 6
  • echo 4
    4
  • for i in 1 2 3 4 5 6
  • echo 5
    5
  • for i in 1 2 3 4 5 6
  • echo 6
    6

带+号的是代码,不带+号的是输出,脚本量大的时候很费劲,缺乏交互性

代码中加入sleep语句可以改进,ctrl+z暂停调试,fg语句继续调试

bashdb调试
eg:

#!/bin/bash

echo "welcome to bashdb debug -------start"
for i in 1 2 3
do
nowdate=`date -d "-$i day" +%Y-%m-%d`
echo $nowdate
done
echo "welcome to bashdb debug -------end"

:wq
bashdb –debugger /home/shell/bs.sh

【bashdb常用命令】
l 列出当前行上下各5行,总共10行
q|quit 退出
h 帮助
/for/ 向后搜索字符串for
?for? 向前搜索字符串for
x 1+2 计算算术表达式的值
!! ls -laRt 执行shell命令
n 执行下一条语句
s 4 单步执行4次,如遇到函数则进入函数里面
b 4 在行号4处设置断点
del 4 删除行号为4的断点
c 10 一直执行到行号10处
R|run 重新执行当前调试脚本
finish 执行到程序最后
print $i 输出此时i的值,注意不能用echo

——shell完——

—-2018-04-06—-
——Hadoop——
Apache Hadoop平台(项目)是一个框架,允许使用简单的编程模型
在计算机集群中对大型数据集进行分布式处理
该平台被设计成可以从单个服务器扩展到数千台服务器,每个服务器都提供本地计算和存储
该平台也被设计成可以检测和处理应用层的故障(即高可靠,高容错),高可用服务是基于计算机集群的,并且其中每一台计算机基址都有可能出错

hadoop单机版安装
a、解压安装包到指定目录
b、为hadoop配置环境变量
vi /etc/profile

#mysetting
HADOOP_HOME=/usr/local/hadoop-2.7.1/
JAVA_HOME=/usr/local/jdk1.7.0_79/
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:

c、配置hadoop的安装目录下的./etc/hadoop/hadoop-env.sh(告诉hadoop我们的jdk的安装目录)
vi /usr/local/hadoop-…/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.7.0_79/
d、测试
which hadoop
hadoop version

hadoop例子
将hadoop安装目录下./etc/hadoop/所有的xml文件拷贝到/home/input下,并统计文件中每个单词出现的次数

mkdir /home/input
cp ./etc/hadoop/*.xml /home/input
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /home/input /home/output

之后在/home/output目录下即会出现两个文件
part-r-00000
_SUCCESS

part-r-00000存放运行结果,可以通过more命令查看
_SUCCESS表示运行成功

Hadoop三大核心:HDFS、MapReduce、YARN

Hadoop四个模块
Hadoop Common:为其他Hadoop模块提供基础设施
Hadoop DFS:一个高可靠、高吞吐量的分布式文件系统
Hadoop MapReduce:一个分布式的离线并行计算框架
Hadoop YARN:集群资源统一管理和任务调度

HDFS源自于Google的GFS论文,HDFS是GFS克隆版

Hadoop Distributed File System
易于扩展的分布式文件系统
运行在大量普通廉价机器上,提供容错机制
为大量用户提供性能不错的文件存取服务

HDFS设计目标
1、存储量大
2、自动快速检测应对硬件错误
3、流式访问数据
4、移动计算比移动数据本身更划算
5、简单一致性模型
6、异构平台可移植

HDFS的特点
优点:
(一)高可靠性:Hadoop一般都在成千的计算机集群之上,且可以搭建hadoop的高可靠集群,及内部容错功能优秀
(二)高扩展性:Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中
(三)高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快
(四)高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配
缺点:
(一)不适合低延迟数据访问
(二)无法高效存储大量小文件
(三)不支持多用户写入及任意修改文件

HDFS三个服务
1.namenode metadata元数据
2.secondary namenode
3.datanode

NameNode
·Namenode是一个中心服务器,单一节点(简化系统的设计和实现),负责管理文件系统的名字空间(namespace)以及客户端对文件的访问
·文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈
·副本存放在哪些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带块消耗和读取时延
·Namenode全权管理数据块的复制,它周期性地从集群中的每个DataNode接收心跳信号(周期为3s,十分钟没接收到心跳信号NameNode会判定其死亡,转移复制数据到其他DataNode)和块状态报告(Blockreport,周期为1h)。接收到心跳信号意味着该DataNode节点工作正常。块状态报告包含了一个该DataNode上所有数据块的列表

DataNode
·一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据(包括数据块的长度,块数据的校验和,以及时间戳)
·DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息
·心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用
·集群运行中可以安全加入和退出一些机器

YARN设计目标
·通用的同意资源管理系统
同时运行长应用程序和短应用程序
·长应用程序
通常情况下,永不停止运行
Service(hadoop,Spark,Storm)、HTTP Server等
·短应用程序
短时间(秒级、分钟级、小时级)内会运行结束的程序
MR job、Spark Job等

YARN服务组件
·组件
Client
ResourceManager、Application Master
NodeManager、Container
·其他组件
JobHistoryServer、TimelineServer
mr-jobhistory-daemon.sh start historyserver
·YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave
·ResourceManager负责对各个NodeManager上的资源进行统一管理和调度
·当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManager启动可以占用一定资源的任务
·由于不同的ApplicationMaster被分不到不同的节点上,因此它们之间不会相互影响

ResourceManager
·全局的资源管理器,整个集群只有一个,负责集群资源的统一管理和调度分配
·功能:
处理客户端请求
启动/监控ApplicationMaster
监控NodeManager
资源分配与调度

NodeManager
·整个集群有多个,负责单节点资源管理和使用
·功能:
单个节点上的资源管理和任务管理
处理来自ResourceManager的命令
处理来自ApplicationMaster的命令
·NodeManager管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源
·定时地向RM回报本节点上的资源使用情况和各个Container的运行状态

ApplicationMaster
·管理一个在YARN内运行的应用程序的每个实例
·功能:
数据切分
为应用程序申请资源,并进一步分配给内部任务
任务监控与容错
·负责协调来自ResourceManager的资源,并通过NodeManager见识容器的执行和资源使用(CPU、内存等的资源分配)

Container
·YARN中的资源抽象,封装某个节点上多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM向AM返回的资源便是用Container表示的
·YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源
·功能:
对任务运行环境的抽象
描述一系列信息
任务运行资源(节点、内存、CPU)
任务启动命令
任务运行环境

YARN优势
·更快地MapReduce计算
·对多框架支持
·框架升级更容易

YARN资源管理
·资源调度和资源隔离是YARN作为一个资源管理系统,最重要和最基础的两个功能。资源调度由ResourceManager完成,而资源隔离由各个NodeManager实现
·ResourceManager将某个NodeManager上资源分配给任务(这就是所谓的“资源调度”)后,NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的资源隔离
·当谈及资源时,我们通常指内存,CPU和IO三种资源。Hadoop YARN同时支持内存和CPU两种资源的调度
·内存资源的多少会决定任务的生死,如果内存不够,任务可能会运行失败;相比之下,CPU资源则不同,它只会决定任务运行的快慢,不会对生死产生影响

1、克隆虚拟机,至少总共有3台虚拟机
2、克隆后的配置
a、修改网卡信息
vi /etc/udev/rules.d/70-persistent-net.rules
删掉网卡eth0的相关信息
将eth1修改为eth0
b、修改主机名
vi /etc/sysconfig/network
c、修改ip信息
vi /etc/sysconfig/network-scripts/ifcfg-eth0
UUID改成与之前不同
ip改成与之前不同
MAC地址改正
d、修改映射
vi /etc/hosts
最后加入
192.168.152.111 hadoop01 www.hadoop01.com
192.168.152.112 hadoop02 www.hadoop02.com
192.168.152.113 hadoop03 www.hadoop03.com

Hadoop的集群配置
·搭建hadoop的集群
Local (Standalone) Mode
Pseudo-Distributed Mode
Fully-Distributed Mode

·hadoop全分布式环境搭建:
一、规划:
主机名称 IP地址 功能
hadoop01 192.168.216.111 NameNode、DataNode、ResourceManager、NodeManager
hadoop02 192.168.216.112 DataNode、NodeManager
hadoop03 192.168.216.113 DataNode、NodeManager
所有机子都需要配置:
1.JDK 2.SSH免登录 3.Hadoop集群

二、配置hadoop的相关配置文件(6个)
官网有相关介绍http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html
1、vi ./etc/hadoop/hadoop-env.sh 配置java路径(之前已经配好)

2、vi ./etc/hadoop/core-site.xml

<configuration>
<!--配置hdfs文件系统的命名空间-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!--配置操作hdfs的缓存大小-->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--配置临时数据存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/bigdata/tmp</value>
</property>
</configuration>

3、vi ./etc/hadoop/hdfs-site.xml hdfs模块的相关配置

<configuration>
<!--副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--块大小 hadoop2是128M hadoop1是64M-->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<!--hdfs的元数据存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoopdata/dfs/name</value>
</property>
<!--hdfs的数据存储位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoopdata/dfs/data</value>
</property>
<!--hdfs的检测目录-->
<property>
<name>fs.checkpoint.dir</name>
<value>/home/hadoopdata/checkpoint/dfs/cname</value>
</property>
<!--hdfs的NameNode的web ui地址-->
<property>
<name>dfs.http.address</name>
<value>hadoop01:50070</value>
</property>
<!--hdfs的SNN的web ui地址-->
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop01:50090</value>
</property>
<!--是否开启web操作hdfs-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>false</value>
</property>
<!--是否启动hdfs的权限(acl)-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>

4、mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
vi ./etc/hadoop/mapred-site.xml

<configuration>
<!--指定mapreduce运行框架-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
<!--历史服务的通信地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<!--历史服务的web ui地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>

5、vi ./etc/hadoop/yarn-site.xml

<configuration>
<!--指定RM所启动的服务主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<!--指定mr的shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定RM的内部通信地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop01:8032</value>
</property>
<!--指定rm的scheduler的内部通信地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop01:8030</value>
</property>
<!--指定rm的resource-tracker的内部通信地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop01:8031</value>
</property>
<!--指定rm的admin的内部通信地址-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop01:8033</value>
</property>
<!--指定rm的web ui监控地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop01:8088</value>
</property>
</configuration>

6、vi ./etc/hadoop/slaves

hadoop01
hadoop02
hadoop03

三、远程分发别的服务器上面:
1、删除hadoop02,hadoop03上面的hadoop
rm -rf /usr/local/hadoop-2.7.1/
2、删除./share下面的doc文档(比较杂)
rm -rf ./share/doc
3、分发
scp -r ../hadoop-2.7.1/ hadoop02:/usr/local
scp -r ../hadoop-2.7.1/ hadoop03:/usr/local

四、启动之前,在NameNode服务器上先格式化,只需要一次即可
hadoop namenode -format

五、启动namenode、datanode、ResoureManager、NodeManager节点
全启动:start-all.sh
模块启动:
start-dfs.sh
start-yarn.sh
单个进程启动:
hadoop-daemon.sh start/stop namenode
hadoop-daemons.sh start/stop datanode
yarn-daemon.sh start/stop namenode
yarn-daemon.sh start/stop datanode
mr-jobhistory-daemon.sh start/stop historyserver

hdfs测试: 启动hdfs模块 ./sbin/start-dfs.sh
1、查看进程是否按照规划启动起来 jps
2、查看对应模块的web ui监控是否正常:
192.168.152.111:50070
3、上传和下载文件(测试hdfs)
首先查看根目录下是没有东西的:
hdfs dfs -ls /
上传一个文件
hdfs dfs -put ./README.txt /
再查看根目录下就有刚刚上传的文件了
hdfs dfs -ls /
也可以查看上传的文件的内容
hdfs dfs -cat /README.txt

yarn测试: 启动yarn模块 start-yarn.sh
1、查看进程是否按照规划启动起来 jps
2、查看对应模块的web ui监控是否正常:
192.168.152.111:8088
3、跑一个mapreduce的作业
yarn jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /README.txt /out/00

—-2018-04-07—-
·SSH免登陆配置
ssh-keygen -t rsa
ll ~/.ssh/ #运行完后这里会多3个文件
ssh hadoop01 #可以发现现在登陆是需要密码的
exit #推出登陆
ssh-copy-id hadoop01
exit
#执行完上两步会在~/.ssh/下面生成authorized_keys文件,以后就可以免密登陆了
#之后再执行
ssh-copy-id hadoop02
exit
ssh-copy-id hadoop03
exit
#这样就设置完免登陆了,之后停止服务也不需要密码了
stop-all.sh #也是不需要密码的

start-all.sh #再启动也不需要密码了,一键启动
#启动之后检查是否全部正常工作
[root@hadoop01 hadoop-2.7.1]# jps
4605 Jps
3747 NameNode
4037 SecondaryNameNode
3876 DataNode
4291 NodeManager
4187 ResourceManager
[root@hadoop02 ~]# jps
2506 NodeManager
2401 DataNode
2633 Jps
[root@hadoop03 ~]# jps
1975 NodeManager
2101 Jps
1874 DataNode

·HDFS Shell命令
输入hdfs dfs -查看可以追加的命令

Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
    [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] <path> ...]
    [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-d] [-h] [-R] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]




    hdfs dfs -ls [-R] /
    hadoop fs -ls [-R] /
    hdfs dfs -mkdir -p /test/01/02  #递归创建文件加-p
    hdfs dfs -touchz /test/te.txt   #注意不能修改文件内容,只能追加,用-appendToFile
    hdfs dfs -cp /test/te.txt /test/01
    hdfs dfs -mv /test/01/te.txt /test/02       #移动不改名
    hdfs dfs -mv /test/02/te.txt /test/01/te    #移动并改名
    hdfs dfs -put ./NOTICE.txt /test        #上传文件
    hdfs dfs -copyFromLocal ./LICENSE.txt /test #上传文件
    hdfs dfs -get /test/NOTICE.txt /home/notice #下载的同时改名
    hdfs dfs -copyToLocal /test/README.txt /home    #下载文件
    hdfs dfs -text /test/NOTICE.txt         #查看文件内容
    hdfs dfs -tail /test/NOTICE.txt         #查看文件内容
    hdfs dfs -cat /test/NOTICE.txt          #查看文件内容
    hdfs dfs -du /test              #列出各文件大小
    hdsf dfs -du -s /test               #目录大小总和
    hdfs dfs -rm [-R] /test/LICENSE.txt     #删除文件或者目录

·windows中安装maven
1、解压
2、配置环境变量
3、配置setting.xml文件,指定本地仓库位置
在安装目录下conf/settings.xml中第53行复制下去,改为:
D:\installed\mavenrepository
4、和java的编辑工具整合(eclipse,idea,myeclipse等)
http://mvnrepository.com/

·Java读取hdfs的文件
public static void readFileToConsole(String path) throws IOException{
//获取配置文件
Configuration conf = new Configuration();
//配置
conf.set(“fs.defaultFS”,”hdfs://192.168.152.111:9000”);
//获取hdfs文件系统的操作对象
FileSystem fs = FileSystem.get(conf);
//具体对文件的操作
FSDataInputStream fis = fs.open(new Path(path));
IOUtils.copyBytes(in,out,buffSize,close);
IOUtils.copyBytes(fis,System.out,4096,true);
}

—-看来要开始重新学一学java了…—

—-此处省略一些东西…—-

—-Hadoop核心协议RPC—-
概念:远程过程调用(RPC)是一个协议,程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需要知道网络细节。

必备知识:
网络七层模型
网络四层模型

—-停更—-博主学java去了…—-

猜你喜欢

转载自blog.csdn.net/qq_39776901/article/details/79811521