Fork me on GitHub

Hadoop-全分布模式搭建

1.Hadoop安装准备工作:

(1)安装好linux操作系统
(2)关闭防火墙
(3)在linux上安装JDK
(4)hadoop2,hadoop3,hadoop4三台服务器已经设置过免密登陆

2.解压Hadoop压缩包并配置环境变量

(1)将Hadoop安装包拷贝到/opt/software文件目录下
(2)将Hadoop安装包解压到/opt/module文件目录下

命令为:

1
tar -zxvf hadoop-2.8.4.tar.gz -C /opt/module          //将hadoop-2.8.4.tar.gz解压到/opt/module目录下
(3)配置环境变量
(a)修改环境变量配置文件

修改命令:

1
vi ~/.bash_profile          //修改环境变量的文件

添加的内容为:

1
2
3
4
HADOOP_HOME=/opt/module/hadoop-2.8.4
export HADOOP_HOME
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH
(b)使环境变量生效

输入命令:

1
source ~/.bash_profile

3.修改配置文件

(1)修改hadoop-env.sh

命令:

1
vi hadoop-env.sh                             //修改hadoop-env.sh文件

修改内容为:

1
export JAVA_HOME=/opt/module/jdk1.8.0_144          //修改JAVAHOME地址,改为自己建的jdk地址,应该在25行              

jdk

(2)修改hdfs-site.xml

命令:

1
2
3
cd /opt/module/hadoop-2.8.4/etc/hadoop              //进入etc/hadoop目录

vi hdfs-site.xml // 修改hdfs-site.xml文件

修改内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--配置数据块的冗余度,默认是3-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop3:50090</value>
</property>
<!-- 配置HDFS的权限检查,默认是true-->
<!--
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
-->

hdfs-site.xml

(3)修改core-site.xml

命令:

1
vi core-site.xml

修改内容为:

1
2
3
4
5
6
7
8
9
10
<!--配置HDFS的主节点,namenode地址,9000是RPC通信端口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop2:9000</value>
</property>
<!--配置HDFS数据块和元数据保存的目录,一定要修改 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.8.4/data/tmp</value>
</property>

core-site.xml

(4)修改mapred-site.xml(默认是没有的,需要从mapred-site.xml.template复制转化而来)

命令:

1
2
3
cp mapred-site.xml.template mapred-site.xml       //从mapred-site.xml.template转化

vi mapred-site.xml //修改mapred-site.xml 文件

修改内容为:

1
2
3
4
5
<!--配置MR程序运行的框架,Yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

mapred-site.xml

(5)修改yarn-site.xml

命令:

1
vi yarn-site.xml 

修改内容为:

1
2
3
4
5
6
7
8
9
10
<!--配置Yarn的节点-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop2</value>
</property>
<!--NodeManager执行MR任务的方式是Shuffle洗牌-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

yarn-site.xml

(6)修改slaves

命令:

1
vi slaves

修改内容为:

1
2
hadoop3            //hadoop3作为从节点
hadoop4 //hadoop4作为从节点

slaves

4.通过HDFS namenode格式化(注意,要再namenode结点所在服务器格式化,本次即是在hadoop2中进行格式化)

命令:

1
2
3
cd /opt/module/hadoop-2.8.4/data/tmp         //这里是step3配置的HDFS数据库和元数据存储目录

hdfs namenode -format //格式化

验证是否成功,成功后回显示:

1
Storage: Storage directory /opt/module/hadoop-2.8.4/tmp/dfs/name has been successfully formatted

验证格式化成功

注意
重复格式化,hadoop.tmp.dir 先停止集群,然后在删除tmp文件夹,再重新新建tmp文件夹,重新格式化,然后再启动集群

5.通过scp拷贝,将hadoop2配置好的hadoop发送到另外两台机器上:

命令:

1
2
3
4
5
//拷贝到hadoop4
scp -r /opt/moudle/hadoop-2.8.4/ root@hadoop3:/opt/moudle/

//拷贝到hadoop4
scp -r /opt/moudle/hadoop-2.8.4/ root@hadoop4:/opt/moudle/

6.启动Hadoop集群

(1)启动

输入命令

1
start-all.sh             //hadoop2中启动,因为此机器是主节点

启动

(2)验证是否启动:

hadoop2:
hadoop2
hadoop3:
hadoop3
hadoop4:
hadoop4

与规划的相同,故Hadoop全分布安装成功

Hadoop基础介绍

一.Hadoop概述

1.Hadoop的优势

  • 高可靠性:
    因为Hadoop假设计算元素和存储会出现故障,因为它维护多个工作数据副本,在出现故障时可以对失败的节点重新分布处理。

  • 高扩展性:
    在集群间分配任务数据,可方便的扩展数以千计的节点。

  • 高效性:
    在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。

  • 高容错性:
    自动保存多份副本数据,并且能够自动将失败的任务重新分配。

2.Hadoop组成

hadoop组成

  • Hadoop HDFS:Hadoop Distributed File System
    一个高可靠、高吞吐量的分布式文件系统。
  • Hadoop MapReduce:
    一个分布式的离线并行计算框架。
  • Hadoop YARN:
    作业调度与集群资源管理的框架。
  • Hadoop Common:
    支持其他模块的工具模块(Configuration、RPC、序列化机制、日志操作)。

3.YARN架构概述

(1)ResourceManager(rm):

处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度

(2)NodeManager(nm):

单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令

(3)ApplicationMaster:

数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错

(4)Container:

对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息

4.MapReduce架构概述

(1)MapReduce将计算过程分为两个阶段:Map和Reduce
  • Map阶段并行处理输入数据
  • Reduce阶段对Map结果进行汇总

二.Hadoop

1.hadoop启动方式:

(1)启动hdfs集群:
1
start-dfs.sh
(2)启动yarn集群:
1
start-yarn.sh
(3)启动hadoop集群:
1
start-all.sh

Hadoop启动和停止命令:
以下命令都在$HADOOP_HOME/sbin下,如果直接使用,记得配置环境变量

作用 命令
启动/停止历史服务器 mr-jobhistory-daemon.sh start|stop historyserver
启动/停止总资源管理器 yarn-daemon.sh start|stop resourcemanager
启动/停止节点管理器 yarn-daemon.sh start|stop nodemanager
启动/停止 NN 和 DN start|stop-dfs.sh
启动/停止 RN 和 NM start|stop-yarn.sh
启动/停止 NN、DN、RN、NM start|stop-all.sh
启动/停止 NN hadoop-daemon.sh start|stop namenode
启动/停止 DN hadoop-daemon.sh start|stop datanode

2.namenode工作机制

namenode工作机制

(1)触发checkpoint的条件
  • 定时的时间
  • edits中数据已满
(2)配置checkpoint时间(hdfs-site.xml):
1
2
3
4
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>7200</value>
</property>

3.datanode工作机制

datanode工作机制

4.Hadoop-MapReduce

(1)MapReduce分布式计算程序的编程框架。基于hadoop的数据分析的应用。
(2)MR优点:
  • 框架易于编程
  • 可靠容错(集群)
  • 可以处理海量数据(T+ PB+)
  • 拓展性,可以通过动态的增减节点来拓展计算能力

5.MapReduce的思想

例如有数据:海量单词

1
2
3
4
hello reba 
hello mimi
hello liya
mimi big

解决方式:

(1)每个单词记录一次(map阶段)

<hello,1> <reba,1> <hello,1> <mimi,1>

(2)相同单词的key不变,value累加求和即可(reduce阶段)

<hello,1+1+1>

mapreduce思想
mapreduce

6.MapReduce程序:

命令格式:

  • hadoop jar 程序压缩包 函数名称 函数参数
1
hadoop jar hadoop-mapreduce-examples-2.8.4.jar wordcount /in/a.txt /out         //运行wordcount函数,计算HDFS中/in/a.txt文件中单词计数 ,将结果保存在/out目录下

7.Hadoop数据类型:

(1)我们看到的wordcount程序中的泛型中的数据类型其实是hadoop的序列化的数据类型。
(2)为什么要进行序列化?用java的类型行不行?
  • Java的序列化:Serliazable太重。 hadoop自己开发了一套序列化机制。Writable,精简高效。海量数据。
    (3)Hadoop序列化类型与Java数据类型
Java数据类型 Hadoop序列化类型
int IntWritable
long LongWritable
boolean BooleanWritable
byte ByteWritable
double DoubleWritable
String Text
float FloatWritable

8.两种模式测试wordcount程序

  • 本地模式:需要在本地搭建Hadoop(winutils 见另一篇文章)
  • 集群模式:将在windows写好的wordcount程序打包上传到集群测试运行。
(1)Maptask决定机制:

maptask决定机制

9.Yarn

(1)Yarn工作流程

yarn工作流程

(2)yarn架构介绍

yarn架构介绍

10.小文件优化

(1)如果企业中存在海量的小文件数据 TextInputFormat按照文件规划切片,文件不管多小都是一个单独的切片,启动mapt ask任务去执行,这样会产生大量的maptask,浪费资源。
(2)优化手段:

小文件合并大文件,如果不动这个小文件内容。

11.分区(实例程序IDEAlogs1)

(1)总结:

1)自定义类继承partitioner<key,value>
2)重写方法getPartition()
3)业务逻辑
4)在driver类中加入setPartitionerClass
5)注意:需要指定setNumReduceTasks(个数=分区数+1)

12.排序(实例程序logs2)

需求:每个分区内进行排序?
总结: 1)实现WritableComparable接口 2)重写compareTo方法
combineTextInputFormat设置切片的大小 maptask

13.mapreduce流程

mapreduce流程

14.combiner合并

(1)combiner是一个组件
  • 注意:是Mapper和Reducer之外的一种组件 但是这个组件的父类是Reduer
    (2)如果想使用combiner继承Reduer即可
    (3)通过编写combiner发现与reducer代码相同 只需在driver端指定 setCombinerClass(WordCountReduer.class)
  • 注意:前提是不能影响业务逻辑
1
<a,1><c,1> <a,2><a,1> = <a,3> 

数学运算: (3 + 5 + 7)/3 = 5
(2 + 6)/2 = 4
不进行局部累加:(3 + 5 + 7 + 2 + 6)/5 = 23/5
进行了局部累加:(5+4)/2 = 9/2=4.5 不等于 23/5=4.6

15.shuffle机制

shuffle机制

16.数据压缩

(1)为什么对数据进行压缩?
  • mapreduce操作需要对大量数据进行传输
  • 压缩技术有效的减少底层存储系统读写字节数,hdfs。
  • 压缩提高网络带宽和磁盘空间效率。
  • 数据压缩节省资源,减少网络I/O。
  • 通过压缩可以影响到mapreduce性能。(小文件优化,combiner)代码角度进行优化。

注意:利用好压缩提高性能,运用不好会降低性能。 压缩 -> 解压缩

(2)mapreduce常用的压缩编码
压缩格式 是否需要安装 文件拓展名 是否可以切分
DEFAULT 直接使用 .deflate
bzip2 直接使用 .bz2
Gzip 直接使用 .gz
LZO 需要安装 .lzo
Snappy 需要安装 .snappy
(3)性能测试:
压缩格式 源文件大小 压缩后大小 压缩速度 解压速度
gzip 8.3GB 1.8GB 20MB/s 60MB/s
LZO 8.3GB 3GB 50MB/s 70MB/s
bzip2 8.3GB 1.1GB 3MB/s 10MB/s
(4)数据压缩发生的阶段
(a)数据源

    ->数据传输,可以进行数据压缩

(b)mapper阶段

    mapper端输出压缩
    ->数据传输,可以进行压缩(一般数据源到mapper的压缩与Mapper此处压缩的效率是差不多的, 选择在mapper压缩较好 )

(c )reducer阶段

    reduce端输出压缩
    ->数据传输,可以进行数据压缩

(d)结果数据
  • 设置map端输出压缩
1
2
conf.setBoolean("mapreduce.map.output.compress",true);      //开启压缩
conf.setClass("mapreduce.map.output.compress.codec",BZip2Codec.class,CompressionCodec.class); //设置压缩方式,压缩编码
  • 设置reduce端输出压缩:
1
2
3
FileOutputFormat.setCompressOutput(job,true);   //设置reduce端输出压缩

FileOutputFormat.setOutputCompressorClass(job,BZip2Codec.class); //设置压缩方式
(5)压缩编码使用的场景
(a).Gzip压缩方式
  • 压缩率比较高,并且压缩解压缩速度很快;
  • hadoop自身支持的压缩方式,用gzip格式处理数据就像直接处理文本数据是完全一样的;
  • 在linux系统自带gzip命令,使用很方便简洁。
  • 不支持split 使用每个文件压缩之后大小需要在128M以下(块大小) 200M->设置块大小
(b).LZO压缩方式
  • 压缩解压速度比较快并且,压缩率比较合理;
  • 支持split 在linux系统不可以直接使用,但是可以进行安装。
  • 压缩率比gzip和bzip2要弱,hadoop本身不支持。 需要安装。
(c ).Bzio2压缩方式
  • 支持压缩,具有很强的压缩率。hadoop本身支持。
  • linux中可以安装。
  • 压缩解压缩速度很慢。
(d).Snappy压缩方式
  • 压缩解压缩速度很快。而且有合理的压缩率。
  • 不支持split

17.数据倾斜

(1)如何规避数据倾斜:
  • 在Map阶段之前就将数据合并

18.优化-MapReduce程序的编写过程中考虑的问题

(1)优化目的:
  • 提高程序运行的效率
(2)优化方案:如何优化MR程序

影响MR程序的因素:

(a).硬件
  • 提升硬件(CPU/磁盘(固态、机械)/内存/网络…)
(b).I/O优化:传输
  • maptask与reducetask合理设置个数
  • 数据倾斜(reducetask-》merge):避免出现数据倾斜
  • 大量小文件情况 (combineTextInputFormat)
  • combiner优化(不影响业务逻辑)
(3)具体优化方式:MR(数据接入、Map、Reduce、IO传输、处理倾斜、参数优化)
(a).数据接入:
  • 解决方式:小文件的话 进行合并 ,namenode存储元数据信息,sn
(b).Map:会发生溢写,如果减少溢写次数也能达到优化,溢写内存增加这样就减少了溢写次数
  • 解决方式:修改mapred-site.xml
1
2
3
mapreduce.task.io.sort.mb     // 100,调大优化

mapreduce.map.sort.spill.percent //0.8,调大优化
(c).combiner:
  • 解决方式:map后优化
(d).reduce:
  • reduceTask设置合理的个数
  • 写mr程序可以合理避免写reduce阶段
  • 设置map/reduce共存,修改配置文件:mapred-site.xml
1
mapreduce.job.reduce.slowstart.completedmaps //默认时0.05,减少它即优化
(e).I/O传输:
  • 解决方式:压缩
(f).数据倾斜:
  • map端合并。手动的对数据进行分段处理,合理的分区。
(4)其他优化方式-非程序:
(a).JVM重用:不关JVM 一个map运行一个jvm,开启重用,在运行完这个map后JVM继续运行其它map。 例如线程池
  • 修改属性
1
mapreduce.job.jvm.numtasks    //20,设置合理的数值,能减少40%左右的运行时间·

19.大数据算法:(见其他文件)

(1)冒泡排序
(2)双冒泡排序
(3)快速排序
(4)归并排序

CentOS7(单节点)安装Redis

1.下载安装包

2.上传到linux

3.解压:

1
2
3
cd /usr/local/tars

tar -zxvf redis-4.0.2.tar.gz -C /usr/local

4.编译:

1
2
3
cd /usr/local/redis-4.0.2

make

编译

5.安装:

1
2
3
cd /usr/local/redis-4.0.2

make PREFIX=/usr/local/redis install //安装

安装

6.拷贝配置文件:

1
2
3
cd /usr/local

cp ./redis-4.0.2/redis.conf ./redis

拷贝

7.修改配置文件

1
2
3
cd /usr/local/redis

vi redis.conf

修改内容如下:

1
2
3
daemonize yes        //是否后台启动

logfile "/usr/local/redis/redis.log" //日志文件地址

8.启动:

1
2
3
cd /usr/local/redis

./bin/redis-server ./redis.conf

9.查看:

1
ps -ef | grep redis

10.启动客户端:

1
2
3
cd /usr/local/redis

./bin/redis-cli

查看

CentOS7(单节点)安装Mongodb

1.上传安装包:将mongodb安装包上传到/usr/local/tars文件目录

上传

2.解压:解压到/usr/local下

1
2
3
cd /usr/local/tars

tar -zxvf mongodb-linux-x86_64-rhel62-3.4.3.tgz -C /usr/local/

解压

3.新建文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd /usr/local/

mv mongodb-linux-x86_64-rhel62-3.4.3/ mongodb //重命名

cd mongodb

mkdir data

cd /usr/local/mongodb/data

mkdir db //用作存放数据
mkdir logs //用作存放日志

cd /usr/local/mongodb/data/logs

touch mongodb.log //新建文件以存放日志

新建目录

4.修改配置文件

1
2
3
4
5
cd /usr/local/mongodb/data

touch mongodb.conf //新建配置文件

vi mongodb.conf //修改配置文件

修改内容如下:

1
2
3
4
5
6
7
dbpath=/usr/local/mongodb/data/db                                      //数据库存放目录

logpath=/usr/local/mongodb/data/logs/mongodb.log //日志地址

fork = true //是否后台运行

logappend = true //日志输出形式

修改配置文件

5.启动

1
2
3
cd /usr/local/mongodb

./bin/mongod -config ./data/mongodb.conf //启动

启动

6.关闭:

1
2
3
cd /usr/local/mongodb

./bin/mongod -shutdown -config ./data/mongodb.conf //关闭

CentOS7安装MySql

1.yum查找mysql依赖的包

1
yum search libaio

查找

2.yum下载mysql依赖的包

1
yum install libaio

下载依赖包

3.搜索wget

1
yum search wget

image.png

4.下载wget

1
yum install wget.x86_64

image.png

5.

1
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

image.png

6.

1
yum localinstall mysql-community-release-el7-5.noarch.rpm

image.png

7.验证是否添加成功

1
yum repolist enabled | grep "mysql.*-community.*"

验证

8.安装:

1
yum install mysql-community-server

安装

9.查看是否安装好

1
whereis mysql

查看

10.启动mysql

1
systemctl start mysqld

11.查看是否启动成功:

1
systemctl status mysqld

image.png

12.关闭mysql

1
systemctl stop mysqld

13.修改mysql密码:

(1)进入mysql
1
mysql
(2)使用mysql库
1
use mysql;
(3)修改密码:
1
update user set password=password('新密码') where user='要更改密码的用户名';
(4)修改用户权限列表:
1
flush privileges;

mysql

(5)重新登陆mysql
1
2
3
mysql -uroot -p

mysql -uroot -proot

登陆

CentOS7安装MySql(已下载的mysql安装包)

1.将下载好的安装包上传到linux:

2.检测本地是否有mysql已存在的包

1
rpm -qa | grep mysql

3.检测本地是否有mariadb已存在的包

1
rpm -qa | grep mariadb

4.如果存在,则使用yum命令卸载

1
2
3
yum -y remove mariadb-libs-5.5.54-2.el7.x86_64
//或者
rpm -e --nodeps mariadb-libs-5.5.54-2.el7.x86_64

5.创建一个文件夹,上传jar包到/opt/software/mysql

1
mkdir /opt/module/mysql

6.解压mysql jar包

1
tar -xvf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql

7.安装mysql的 server、client、common、libs、lib-compat

1
2
3
4
5
rpm -ivh --nodeps mysql-community-server-5.7.19-1.el7.x86_64.rpm
rpm -ivh --nodeps mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.19-1.el7.x86_64.rpm

image.png

8.查看mysql的服务是否启动

1
systemctl status mysqld

9.启动mysql的服务

1
systemctl start mysqld

image.png

10.再次检查mysql的服务是否启动

1
systemctl status mysqld

11.查看默认生成的密码

1
cat /var/log/mysqld.log | grep password

查看默认生成的密码

12.登录mysql服务

1
mysql -uroot -p’然后粘贴上密码’

13.修改mysql密码规则

强度 规则
0 or LOW 长度
1 or MEDIUM 长度、大小写、数字、特殊字符
2 or STRONG 长度、大小写、数字、特殊字符、词典

注:以下修改是临时修改

(a). 密码强度检查等级,0/LOW、1/MEDIUM、2/STRONG
1
set global validate_password_policy=0;
(b).密码至少要包含的小写字母个数和大写字母个数
1
set global validate_password_mixed_case_count=0;
(c ).密码至少要包含的数字个数
1
set global validate_password_number_count=3;
(d).密码至少要包含的特殊字符数
1
set global validate_password_special_char_count=0;
(e).密码最小长度,参数默认为8,
1
set global validate_password_length=3;

    它有最小值的限制,最小值为:validate_password_number_count + 密码至少要包含的数字个数validate_password_special_char_count +特殊字符 (2 * validate_password_mixed_case_count)至少要包含的小写字母个数和大写字母个数

14.修改密码:

1
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('000000');

(这两步可以跳过)

1
2
use mysql;
SHOW VARIABLES LIKE 'validate_password%';
Variable_name Value
validate_password_dictionary_file
validate_password_length 3
validate_password_mixed_case_count 0
validate_password_number_count 3
validate_password_policy LOW
validate_password_special_char_count 0

15.修改远程登录权限

如上图所示:这个是可以成功远程链接得配置
大家默认的%的位置是localhost,即意味着只能本机访问

(1)查询当前user表内root的登录权限:
1
select host,user from mysql.user;
(2)修改权限为所有%:
1
update mysql.user set host = '%' where user = 'root';
(3)刷新缓存:
1
flush privileges;

Linux查看文件前几行和后几行的命令

1.可以使用head(查看前几行)、tail(查看末尾几行)两个命令

例如:
查看/opt/a.txt的前20行内容:

1
head -n 20 /opt/a.txt

查看/opt/a.txt的最后5行内容,应该是:

1
tail  -n 5 /opt/a.txt

2.可以同时查看可以将前10行和后5行的显示信息,并通过输出重定向的方法保存到一个文档

例如:
将内容输出到/opt/test文件中

1
2
3
head -n 10 /opt/a.txt >>/opt/test

tail -n 5 /opt/a.txt >>/opt/test

查看的话只需要打开test文件即可。

1
cat /opt/test
  • Copyrights © 2015-2021 Movle
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信