当前位置:   article > 正文

hadoop学习心得以及完全分布式配置。_hadoop配置环境能学到什么

hadoop配置环境能学到什么

目录

一、对hadoop的认识

二、 hadoop的核心构架

三 、编写一个程序,每天凌晨3点模拟生成当天的新能源车辆数据(字段信息必须包含:车架号、行驶总里程、车速、车辆状态、充电状态、剩余电量SOC、SOC低报警、数据生成时间等)。

1. 要求:

2.搭建集群:

四、编写生成车辆数据的程序一小部分

五、总结 学习心得


一、对hadoop的认识

1.海量数据储存

2.资源管理,提到度和分配

3.并行数据处理

二、 hadoop的核心构架

        Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。

来源:百度百科

1.HDFS  

        对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。

2.NemeNode   

        NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件

3.DetaNode  

        DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件

4.文件操作

        如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。

        同时也通知将要保存文件块副本的 DataNode。当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。

        在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)。

5. Linux  集群

        Hadoop 框架可在单一的 Linux 平台上使用(开发和调试时),官方提供MiniCluster作为单元测试使用,不过使用存放在机架上的商业服务器才能发挥它的力量。这些机架组成一个 Hadoop 集群。它通过集群拓扑知识决定如何在整个集群中分配作业和文件。Hadoop 假定节点可能失败,因此采用本机方法处理单个计算机甚至所有机架的失败。

三 、编写一个程序,每天凌晨3点模拟生成当天的新能源车辆数据(字段信息必须包含:车架号、行驶总里程、车速、车辆状态、充电状态、剩余电量SOC、SOC低报警、数据生成时间等)。

1. 要求:

1.最终部署是,将这些数据写到第一题的hdfs中。

2、车辆数据要按天存储,数据格式是JSON格式,另外如果数据文件大于100M,则另起一个文件存。每天的数据总量不少于300M。比如假设程序是2023-01-1 03点运行,那么就将当前模拟生成的数据写入到HDFS的/can_data/2023-01-01文件夹的can-2023-01-01.json文件中,写满100M,则继续写到can-2023-01-01.json.2文件中,依次类推;

3、每天模拟生成的车辆数据中,必须至少包含20辆车的数据,即要含有20个车架号(一个车架号表示一辆车,用字符串表示);

4、每天生成的数据中要有少量(20条左右)重复数据(所有字段都相同的两条数据则认为是重复数据),且同一辆车的两条数据的数据生成时间间隔两秒;

5、每天生成的数据中要混有少量前几天的数据(即数据生成时间不是当天,而是前几天的)。

2.搭建集群:

1. Hadoop集群规划:

                Hadoop是典型的主从架构。HDFS的NameNode是主,DataNode是从,YARN的ResourceManager是主,NodeManager是从。在正式集群部署之前,先要做规划,规划好每个主机/节点分别运行Hadoop的哪些进程。这样做,有两个好处:

1.指导部署,没有规划图,很可能部署过程中就容易迷失,一个小小的细节没处理好,可能导致集群启动失败;

2.方便日后查询。例如查询哪些进程在哪些节点上运行等。

Hadoop集群规划

主机IP

主机的主机名

HDFS

YARN

192.168.53.100

master

NameNode

DataNode

ResourceManager

NodeManager

192.168.53.101

slave1

SecondaryNameNode

DataNode

NodeManager

192.168.53.102

slave2

DataNode

NodeManager

注意:要根据实际虚拟机修改IP地址,每个虚拟机的IP网段可能都不一样。

2. 虚拟机

(1)这里的话我们需要三台虚拟机,这里是我以前用的hadoop伪分布式虚拟机直接复制过来的三台虚拟机:

 每个虚拟机都是一个文件夹,复制的时候要注意,要复制在同意路径下的不同文件夹里。

(2)用vmware虚拟机打开master、save1、save2文件夹下的虚拟机,并重命名。

(3)修改三个虚拟机的IP,每台虚拟机的IP都不一样,IP修改完以后要重启网卡

以下是我改master虚拟机的IP,其他两个虚拟机也是一样的操作

修改IP的命令如下:vi /etc/sysconfig/network-scripts/ifcfg-ens33;

重启网卡命令:service network restart;

 用 ping www.baidu.com 确认访问外网有没有问题。

执行 :hostnamectl set-hostname master, 将主机名改为master,其他两个也是一样的操作。

最后退出root,重新登录,命令符看到新的主机名即可。

3 . 修改master,save1,save2 的IP映射。

 修改IP映射的命令:vi /etc/hosts 

查看命令:cat /etc/hosts

为了避免写错,master 的 hosts 映射配置好后,通过 scp 命令,将master修改好的 /etc/hosts 文件,同步到另外两个主机上。

将hosts同步到save1的/etc路径下,默认覆盖所有的文件。

命令:scp / etc/hosts root@save1:/etc  ,    save2也是同样的方法。

4 . 设置免密登录,关闭防火墙,删除hadoop伪分布式数据。

        1. 因为 master,save1,save2 三个节点是我从以前的安装好的伪分布式的虚拟机复制过来的,而当时我已经设好了免密登录,因此这里我就不用再设置了。

2. 防火墙:

        防火墙实质是一个程序,它可以控制系统进来或者出去的流量。Centos7默认情况下,防火墙是开机自起的。在集群部署模式下,各个节点之间的进程要通信,为了方便,一般都要关闭防火墙。

2.1 首先查看防火墙的状态

2.2 关闭防火墙 

2.3 查看防火墙是否会开机自启

 2.4 禁止防火墙开机自启

 以上是我课件上的一些步骤。(如果这个看不懂可以自行上网查找更详细的教程。)

 因为master,save1,save2 是伪分布式复制过来的,为了保证这三个节点的环境保持干净,我们需要删掉这个三个虚拟机的伪分布式数据。

首先是切换路径:/usr/local/hadoop-2.7.1/

删除文件:rm - rf ./data/   

注意:如果之前没有设置过免密登录,需要你重新补上这一段,不然每个进程都要输入一次密码的。这个是免密登录教程的链接:

https://blog.csdn.net/ITshu/article/details/105409409

以上这个教程我在网上随便找的一个教程挺详细的,如果有需要可以自行查看。

5 . 修改master主机上的hadoop配置文件

配置文件的路径如下:

vi core-site.xml

vi hdfs-site.xml

 vi yarn-site.xml

vi saves

6 . 将master 主机上的hadoop配置文件,同步到其他两个主机上。

 7 . 时间同步

        hadoop集群各个节点之间的时间应该一致,也就是master当前时间如果是2022-01-01 01:01:01,那么slave1和slave2上也应该是这个时间。如果各个节点之间时间不一致/不同步,那么集群就会一些错误。

        ntp(Network Time Protocol,网络时间协议)是一种跟时间设置相关的协议。客户端-服务端架构。

        ntp.api.bz是一个公开的ntp服务器,执行ntpdate ntp.api.bz命令,可以从这个ntp服务器拉取时间并更新当前机器的时间。在master、slave1、slave2上分别执行该命令,即可完成时间同步,此时三个节点的时间应该是一致的。

如果没有ntpdate插件,需要先把这个插件下载好,才可以将时间同步到各个主机上。

下载命令:yum install -y ntpdata 

时间同步命令:ntpdate ntp4.aliyun.com  

8 . NameNode格式化

格式化只需格式化一次,以后启动Hadoop集群时,不需要再格式化。

在master上执行格式化命令:hdfs namenode -format 

9 . 启动hadoop集群

在master上执行start-all.sh命令启动hadoop集

 

 

这里的话要注意一点就是进程不能多,也不能少,多的话可手动把他停掉,少了的话要把缺少的进程给他补上,不然会影响后期的操作的。(这些就自行上网查询吧。)

10 . 查看hdfs的web管理页面:

浏览器访问master 的 50070 端口 :http://主机名:50070  

四、编写生成车辆数据的程序一小部分

1.生成车辆数据;

随机生成20辆车的车架号,并将它们存入到一个空的了表当中;

设置车辆每一个值的状态;

设置每一个数据生成的时间;

把数据存入到表中;

以下是一部分代码:

  1. def generate_data():
  2. vin_list = ['VIN{}'.format(i) for i in range(1, 21)] # 车架号列表
  3. data_list = []
  4. for vin in vin_list:
  5. mileage = round(random.uniform(1000, 10000), 2) # 行驶总里程
  6. speed = round(random.uniform(0, 120), 2) # 车速
  7. status = random.choice(['running', 'stopped']) # 车辆状态
  8. charge_status = random.choice(['charging', 'discharging', 'idle']) # 充电状态
  9. soc = round(random.uniform(0, 100), 2) # 剩余电量SOC
  10. soc_low_alert = random.choice([True, False]) # SOC低报警
  11. timestamp = int(time.time()) # 数据生成时间
  12. data = {
  13. 'vin': vin,
  14. 'mileage': mileage,
  15. 'speed': speed,
  16. 'status': status,
  17. 'charge_status': charge_status,
  18. 'soc': soc,
  19. 'soc_low_alert': soc_low_alert,
  20. 'timestamp': timestamp
  21. }
  22. data_list.append(data)
  23. return data_list

2.添加重复的数据

一部分代码实例:

  1. data = generate_data()
  2. #添加重复数据
  3. repeat_data = random.sample(data, 20)
  4. data += repeat_data
  5. #添加前几天的数据
  6. for i in range(20):
  7. timestamp = int(time.time()) - (i + 1) * 24 * 60 * 60
  8. vin = random.choice(['VIN{}'.format(i) for i in range(121)])
  9. data.append({
  10. ' vin': vin,
  11. 'mileage': round(random.uniform(100010000),2),
  12. 'speed': round(random.uniform(0120), 2),
  13. ' status': random.choice(['running','stopped']),
  14. 'charge_status': random.choice(['charging','discharging','idle']),
  15. ' soc': round(random.uniform(0, 100),2),
  16. 'soc_Low_alert': random.choice([True, False]),
  17. 'timestamp': timestamp
  18. })
  19. #按时间排序
  20. data.sort(key=lambda x: x['timestamp']) #添加时间间隔为2秒的重复数据
  21. for i in range(len(data) - 1):
  22. if data[i]['vin'] == data[i + 1]['vin']:
  23. data.insert(i + 1,data[i].copy())
  24. data[i + 1]['timestamp'] += 2
  25. #写入HDFS
  26. write_to_hdfs(data, hdfs_path)

3.将数据写入到HDFS当中

一部分代码示例:

  1. def write_to_hdfs(data, hdfs_path):
  2. # 按天存储数据
  3. date_str = time.strftime('%Y-%m-%d', time.localtime(data[0]['timestamp']))
  4. file_name = 'can-{}.json'.format(date_str)
  5. file_path = os.path.join(hdfs_path, date_str, file_name)
  6. if os.path.exists(file_path):
  7. file_size = os.path.getsize(file_path)
  8. if file_size > 100 * 1024 * 1024:
  9. file_name = 'can-{}.{}.json'.format(date_str, int(file_size / (100 * 1024 * 1024)) + 1)
  10. file_path = os.path.join(hdfs_path, date_str, file_name)
  11. else:
  12. os.makedirs(os.path.join(hdfs_path, date_str), exist_ok=True)
  13. # 写入数据
  14. with open(file_path, 'a') as f:
  15. for item in data:
  16. f.write(json.dumps(item) + '\n')

五、总结 学习心得

通过这一个学期的学习,我对hadoop的理解也多了很多,学习了很多东西这里我就写了很少的一部分。

可以讲Hadoop的核心内容看作是两个部分,一个是分布式存储,一个是分布式计算。

对于分布式存储,Hadoop有自己的一套系统来处理叫Hadoop distribution file system。为什么分布式存储需要一个额外的系统来处理呢,而不是就把1TB以上的文件分开存放就好了呢。如果不采用新的系统,我们存放的东西没办进行一个统一的管理。存放在A电脑的东西只能在连接到A去找,存在B的又得单独去B找。繁琐且不便于管理。而这个分布式存储文件系统能把这些文件分开存储的过程透明化,用户看不到文件是怎么存储在不同电脑上,看到的只是一个统一的管理界面。现在的云盘就是很好的给用户这种体验。

对于分布式计算。在对海量数据进行处理的时候,一台机器肯定也是不够用的。所以也需要考虑将将数据分在不同的机器上并行的进行计算,这样不经可以节省大量的硬件的I/O开销。也能够将加快计算的速度。Hadoop对分布式计算的系统为MapReduce。

Map即将数据分开存放进行计算,Reduce将分布计算的得到的结果进行整合,最后汇总得到一个最终的结果。这样对Hadoop的技术有一个清晰框架思路。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/398798
推荐阅读
相关标签
  

闽ICP备14008679号