业务需要根据关键字查询HDFS日志信息,并且需要查看关键字Key之下10行
package com.spark.scala
import org.apache.spark.{SparkContext,SparkConf}
class mylog{
}
object mylog{
def main(args: Array[String]) {
//没有数据源,退出
if(args(0) == 0){
System.err.println("Usage: mylog <file>")
System.exit(1)
}
val conf = new SparkConf().setAppName("mylog")
val sc = new SparkContext(conf)
//加载数据、为每行数据添加索引并调换索引与Value值位置
val f = sc.textFile(args(0)).zipWithIndex.map{
case(x,y)=>(y,x)}
//过滤每行数据是否包含关键字
val lf = f.filter(line=>line._2.toString
.contains(args(1)))
//取得包含关键字数据所在行的索引号
val num = lf.map(x=>x._1.toInt)
//定义查询数据的起止索引
val startNum = num.first + 0
val endNum = num.first + 10
//按起止索引过滤数据,并设置结果只为Value值数据
val s = f.filter(startNum <= _._1).filter(
_._1 <= endNum).map(x=>x._2)
//重设分区以便保存数据到HDFS上为单文件(结果数据较少)
s.repartition(1).saveAsTextFile(args(2))
System.exit(0)
}
}
spark-defaults.conf
测试环境虚拟机内存比较小,设置spark.executor.memory为512m
spark.master yarn-client
spark.executor.memory 512m
spark.local.dir /usr/local/spark/data/tmp_spark_dir
spark-env.sh
建一个脚本submit-yarn.sh执行提交作业工作
cd home
vim submit-yarn.sh
cd /usr/local/spark/spark-1.2.0-bin-hadoop2.4/
./bin/spark-submit --name sparklog \
--class com.spark.scala.mylog \
/home/sparklog.jar \
hdfs://SparkMaster:9000/data \
chensy \
hdfs://SparkMaster:9000/mylog
/home/sparklog.jar 对应的是idea打包后为sparklog.jar,并存放在/home
hdfs://SparkMaster:9000/data 对应代码args(0),输入数据
chensy 对应代码args(1),是查询关键字
hdfs://SparkMaster:9000/mylog 对应代码args(2),输出数据
直接在home目录下,执行 ./submit-yarn.sh
查询结果: hadoop fs -ls /mylog