Hadoop-模拟生成新能源车辆数据并上传到HDFS

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

二、要求:

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、每天生成的数据中要混有少量前几天的数据(即数据生成时间不是当天,而是前几天的)

三、实现流程

1.搭建集群
2.编写生成车辆数据程序
3.部署到HDFS上

四、搭建集群部分

1、集群规划

集群规划
主机IP主机名HDFSYARN
192.168.91.4masterNameNode DataNode ResourceManager NodeManager
192.168.91.5save1SecondaryNameNode DataNodeNodeManager
192.168.91.6save2DataNodeNodeManager
2.准备三台虚拟机:我这里是之前在伪分布式中部署过一台虚拟机了,所以复制三份虚拟机:

(1)创建三个文件夹,分别在每一个文件夹中复制一份虚拟机;
在这里插入图片描述

(2)用vmware打开master、save1、save2文件夹下的虚拟机,并重命名;
(3)修改master/saev1/saev2中的ip并重启网卡命令:
修改IP命令:vi /etc/sysconfig/network-scripts/ifcfg-ens33;
在这里插入图片描述

重启网卡命令:service network restart;
3.修改master、save1、save2的主机名和添加IP的映射:vi /etc/hosts;
在这里插入图片描述
在这里插入图片描述

4.设置免密登录:因为master、save1、save2三个节点都是从之前的已经安装好Hadoop伪分布式的虚拟机复制得来,而当时已经设置了免密登录,故不需再设置了。也就是master可以免密登录到master、save1、save2
5.关闭防火墙:同第四点
6.删除伪分布式数据:
(1)切换路径:cd /usr/local/hadoop-2.7.1/
(2)删除:rm -rf ./data/
7.修改master主机上的配置文件:
(1)vi core-site.xml;
在这里插入图片描述

(2)vi hdfs-site.xml;
在这里插入图片描述

(3)vi yarn-site.xml;
在这里插入图片描述

(4)vi saves;
在这里插入图片描述

8.将master主机上的配置信息同步到saev1/saev2上:
在这里插入图片描述

(1)同步到saev1:scp /etc/hosts root@save1:/etc;
(2)同步到saev2:scp /etc/hosts root@save2:/etc;
9.时间同步:如果没有ntpdate这个插件,请先下载:yum install -y ntpdata
(1)时间同布命令:ntpdate ntp4.aliyun.com
10.NameNode格式化:hdfs namenode -format
(注意:无需多次格式化,一次足矣,至于格式化后确少进程,则有可能是配置文件写的不对)
11.启动集群:分别在每一个节点上都输入一遍start-all.sh
master:在这里插入图片描述
saev1:
在这里插入图片描述
save2:
在这里插入图片描述
(注意:如果进程与规划表上的不一致,只有两种可能性,一是少了,二就是多了,多了的话我们可以停掉多余的进程)

五、编写生成车辆数据程序部分

这里就简单的放一点代码,一小部分
1.生成车辆数据
(1)先随机生成20辆车的车架号,并把它存入一个空的列表中;
(2)设置每一个值的状态;
(3)设置数据生成的时间;
(4)把数据存入列表中;
代码实现:

def generate_data():
    vin_list = ['VIN{}'.format(i) for i in range(121)] # 车架号列表
    data_list = []
    for vin in vin_list:
    mileage = round(random.uniform(100010000)2) # 行驶总里程
        speed = round(random.uniform(0120)2) # 车速
        status = random.choice(['running’,'stopped']) # 车辆状态
        charge_status = random.choice(['charging''discharging''idle']) # 充电状态
        soc = round(random.uniform(0100)2) # 剩余电量SOC
        soc_Low_alert = random.choice([TrueFalse]) # SOC低报警
        timestamp = int(time.time()) # 数据生成时间
        data = {
            'vin': vin,
            'mileage': mileage
            ' speed': speed,
            ' status': status ,
            ' charge_status': charge_status
            ' soc': soc,
            'soc_low_alert': soc_low_alert
            'timestamp': timestamp
        }
        data_list.append(data)
    return data_list

2.添加重复数据
(1)添加重复数据,使用随机添加,在20辆车中随机添加一些重复的数据;
(2)看题目要求:每天生成的数据中要混有少量前几天的数据(即数据生成时间不是当天,而是前几天的),所以我们要添加前几天的数据;
(3)按时间排序:data.sort(key=lambda x:x['timestamp'])
(4)添加时间间隔为2秒的重复数据
(5)将数据写入HDFS
代码实现:

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

六、部署到HDFS上

1.打包生成jar包,并提交至Hadoop集群运行
2.设置定时任务,规定每天凌晨三点的第一分钟运行一次

七、每日一语

行则将至,作则必成;
一念即出,万山无阻。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值