一、实验目的
掌握Map/Reduce相关原理和设计方法,设计相关的应用。
二、实验内容
数据集stock-daily,包含A股近4000只股票的最近30个交易日的日数据,根据此数据实现股票风险监测统计:统计和输出股票代码和风险值
三、实验步骤
1、打开IntelliJ或Eclipse创建Maven项目;
2、参考WordCount示例代码编写本实验代码;
3、基本代码逻辑:
Map
输入:一行数据(一只股票的日数据)
处理:使用 \t 将字符串split成数组,提取需要计算的值,并转为浮点数
输出:<股票代码, 股票当日下行指数>
遇到无效数据不输出(停牌股票或有N/A数据无法提取为浮点数)
Reduce:
输入:<股票代码,[股票每日下行指数]>
处理:计算均值
输出:<股票代码,股票下行指数>
四、实验结果
Pom.xml
junit选择的是5.8.2, log4j是2.17.1,hadoop-hdfs,hadoop-common,hadoop-mapreduce-client-core都是3.1.2,jdk版本1.8.0_161。
完成pom.xml编辑后,点击Import Changes下载所需jar包
Java代码如下:
创建了一个Stock类,实现了run方法
继承Mapper类
继承Reducer类
Java代码编译后,打包jar包,目录如下
三个节点都分配了2GB内存
MapReduce配置
1、mapred-site.xml
增加两个配置:
<property>
<name>mapreduce.admin.user.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value>
</property>
2、yarn-site.xml
增加container本地日志查看配置
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>hadoop安装目录/logs/userlogs</value>
</property>
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>108000</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value> <!--此项小于1536,mapreduce程序会报错-->
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value> <!--防止一级调度器请求资源量过大-->
</property>
设置虚拟内存与内存的倍率,防止VM不足Container被kill
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>3</value>
</property>
上传jar包和数据,并启动Hadoop
Jar包我放在了linux的root目录下
数据放在了hdfs的/usr下,指定输出目录为/usr/output1
输入命令hadoop jar Stock_Index.jar cn.edu.swpu.scs.Stock /usr/stock-daily30d.txt /usr/output1执行jar包,执行信息如下:
查看输出文件部分内容: