1、请列出Hadoop中需要哪些配置文件,其作用是什么(5分)
答:
1)core-site.xml:
(1)fs.defaultFS:hdfs://cluster1(域名),这里的值指的是默认的HDFS路径 。
(2)hadoop.tmp.dir:/export/data/hadoop_tmp,这里的路径默认是NameNode、DataNode、secondaryNamenode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。
(3)ha.zookeeper.quorum:hadoop101:2181,hadoop102:2181,hadoop103:2181,这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点 。
2)hadoop-env.sh: 只需设置jdk的安装路径,如:export JAVA_HOME=/usr/local/jdk。
3)hdfs-site.xml:
(1) dfs.replication:他决定着系统里面的文件块的数据备份个数,默认为3个。
(2) dfs.data.dir:datanode节点存储在文件系统的目录 。
(3) dfs.name.dir:是namenode节点存储hadoop文件系统信息的本地系统路径 。
4)mapred-site.xml:
mapreduce.framework.name: yarn指定mr运行在yarn上。
Hadoop的几个默认端口及其含义
1)dfs.namenode.http-address:50070
2)SecondaryNameNode辅助名称节点端口号:50090
3)dfs.datanode.address:50010
4)fs.defaultFS:8020 或者9000
5)yarn.resourcemanager.webapp.address:8088
2、利用spark进行数据挖掘建模(15分)
本题目只能使用 spark的ml相关技术,不得使用python的数据挖掘。
数据集:
客户流失已成为每个希望提高品牌忠诚度的公司重点关注的问题,本题目基于某电信公司流失客户数据集,将提供训练集和验证集供建模使用,请回复验证集数据的模型计算结果文件和建模过程文档。
a)回复 当前模型的查全率和查准率分别是多少
b)回复结果文件要求
结果文件请以逗号分隔符文本文件提供,包含以下字段:
1、用户标志
2、预测是否进入异常状态(1:异常状态;0-非异常状态)
c)建模过程文 档请以WORD文档形式提供,需要详细列出数据探索过程和建模思路。
数据说明:
字段名称 字段类型 中文名称和注释
USER_ID VARCHAR(16) 用户标志(两文件里的用户标志没有关联性)
FLOW DECIMAL(16) 当月流量(Byte)
FLOW_LAST_ONE DECIMAL(16) 上一月流量(Byte)
FLOW_LAST_TWO DECIMAL(16) 上两个月流量(Byte)
MONTH_FEE DECIMAL(18,2) 当月收入(元)
MONTHS_3AVG DECIMAL(18,2) 最近3个月平均收入(元)
BINDEXP_DATE DATE 绑定到期时间
PHONE_CHANGE INTEGER 当月是否更换终端
AGE INTEGER 年龄
OPEN_DATE DATE 开户时间
REMOVE_TAG CHARACTER(1) 用户状态(‘A’:正常,其他异常)(验证集中不提供此字段)
使用spark的describe函数来对训练集 数据探查,数据描述结果(每一列的最大值,最小值,最大值等数据描述信息)截图(1分):
使用spark的describe函数来对训练集 数据探查,数据描述结果(每一列的最大值,最小值,最大值等数据描述信息)截图(1分):
训练集数据处理 结果截图(3分):
模型的查全率,查准率 结果截图(2分):
代码截图:
预测 结果截图(3分):
def main(args: Array[String]): Unit = {
//创建spark环境
val spark: SparkSession = SparkSession
.builder()
.appName("spark")
.master("local[4]")
.config("spark.sql.shuffle.partitions", 1)
.getOrCreate()
import spark.implicits._
import org.apache.spark.sql.functions._
val data: DataFrame = spark.read
.format("csv")
.option("header", "true")
.load("data/预测集.csv")
data.printSchema()
data.show()
val data1: DataFrame = data.map(row => {
val USER_ID: Double = row.getAs[String]("USER_ID").toDouble
val FLOW: Double = row.getAs[String]("FLOW").toDouble
val FLOW_LAST_ONE: Double = row.getAs[String]("FLOW_LAST_ONE").toDouble
val FLOW_LAST_TWO: Double = row.getAs[String]("FLOW_LAST_TWO").toDouble
val MONTH_FEE: Double = row.getAs[String]("MONTH_FEE").toDouble
val MONTHS_3AVG: Double = row.getAs[String]("MONTHS_3AVG").toDouble
val BINDEXP_DATE: Double = row.getAs[String]("BINDEXP_DATE").toDouble
val PHONE_CHANGE: Double = row.getAs[String]("PHONE_CHANGE").toDouble
val AGE: Double = row.getAs[String]("AGE").toDouble
val OPEN_DATE: Double = row.getAs[String]("OPEN_DATE").toDouble
//特征值
val array: Array[Double] = Array(USER_ID, FLOW, FLOW_LAST_ONE, FLOW_LAST_TWO, MONTH_FEE, MONTHS_3AVG, BINDEXP_DATE, PHONE_CHANGE, AGE, OPEN_DATE)
//将特征值转成向量
val features: linalg.Vector = Vectors.dense(array)
Tuple1(features)
}).toDF("features")
//加载模型
val mode1: LogisticRegression = LogisticRegression.load("data/model")
val proData: DataFrame = mode1.transform(data1)
proData.show()
}
}
建模过程,建模思路描述(6分):