From 32925d3071724a725dd134a27a45bd17a32fb92a Mon Sep 17 00:00:00 2001 From: yanfqidong0604 Date: Tue, 13 Nov 2018 12:35:52 +0800 Subject: [PATCH] Additional stop reading impala, changes to description information of previous Memcache stop, and changes to logo of spider yang qidong --- piflow-bundle/pom.xml | 8 ++ .../main/resources/impala/SelectImpala.json | 46 ++++++++ .../src/main/resources/impala/impala-logo.png | Bin 0 -> 25804 bytes .../piflow/bundle/impala/SelectImpala.scala | 108 ++++++++++++++++++ .../piflow/bundle/internetWorm/spider.scala | 3 +- .../memcache/ComplementByMemcache.scala | 2 +- .../piflow/bundle/memcache/GetMemcache.scala | 2 +- .../piflow/bundle/memcache/PutMemcache.scala | 2 +- .../bundle/impala/SelectImpalaTest.scala | 65 +++++++++++ 9 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 piflow-bundle/src/main/resources/impala/SelectImpala.json create mode 100644 piflow-bundle/src/main/resources/impala/impala-logo.png create mode 100644 piflow-bundle/src/main/scala/cn/piflow/bundle/impala/SelectImpala.scala create mode 100644 piflow-bundle/src/test/scala/cn/piflow/bundle/impala/SelectImpalaTest.scala diff --git a/piflow-bundle/pom.xml b/piflow-bundle/pom.xml index 4e7a6bc..5691622 100644 --- a/piflow-bundle/pom.xml +++ b/piflow-bundle/pom.xml @@ -19,6 +19,14 @@ + + org.apache.hive + hive-jdbc + 1.2.1 + + org.mongodb mongodb-driver diff --git a/piflow-bundle/src/main/resources/impala/SelectImpala.json b/piflow-bundle/src/main/resources/impala/SelectImpala.json new file mode 100644 index 0000000..7e358d3 --- /dev/null +++ b/piflow-bundle/src/main/resources/impala/SelectImpala.json @@ -0,0 +1,46 @@ +{ + "flow":{ + "name":"test", + "uuid":"1234", + "checkpoint":"Merge", + "stops":[ + + { + "uuid":"0000", + "name":"SelectImpala", + "bundle":"cn.piflow.bundle.impala.SelectImpala", + "properties":{ + "url":"10.0.82.165:21050", + "user":"", + "password":"test1", + "sql":"select * from kylin.test1", + "schameString":"pid,name" + + } + }, + { + "uuid":"1111", + "name":"putHdfs", + "bundle":"cn.piflow.bundle.hdfs.PutHdfs", + "properties":{ + "hdfsUrl":"hdfs://10.0.86.89:9000", + "hdfsPath":"/yg/0", + "types":"csv" + } + + } + + + ], + "paths":[ + { + "from":"SelectImpala", + "outport":"", + "inport":"", + "to":"putHdfs" + } + + + ] + } +} \ No newline at end of file diff --git a/piflow-bundle/src/main/resources/impala/impala-logo.png b/piflow-bundle/src/main/resources/impala/impala-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d414518b3cd46e1ebbf96de7b6ac62b2cc32b44d GIT binary patch literal 25804 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 QG5`Po07*qoM6N<$f=IwmumAu6 literal 0 HcmV?d00001 diff --git a/piflow-bundle/src/main/scala/cn/piflow/bundle/impala/SelectImpala.scala b/piflow-bundle/src/main/scala/cn/piflow/bundle/impala/SelectImpala.scala new file mode 100644 index 0000000..1109b80 --- /dev/null +++ b/piflow-bundle/src/main/scala/cn/piflow/bundle/impala/SelectImpala.scala @@ -0,0 +1,108 @@ +package cn.piflow.bundle.impala + +import java.sql.{Connection, DriverManager, ResultSet, Statement} + +import cn.piflow.{JobContext, JobInputStream, JobOutputStream, ProcessContext} +import cn.piflow.conf.{ConfigurableStop, PortEnum, StopGroupEnum} +import cn.piflow.conf.bean.PropertyDescriptor +import cn.piflow.conf.util.{ImageUtil, MapUtil} +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.types.{StringType, StructField, StructType} +import org.apache.spark.sql.{DataFrame, Row, SparkSession} + +import scala.collection.mutable.ArrayBuffer + + +class SelectImpala extends ConfigurableStop{ + override val authorEmail: String = "yangqidong@cnic.cn" + override val description: String = "get data from impala" + val inportList: List[String] = List(PortEnum.NonePort.toString) + val outportList: List[String] = List(PortEnum.DefaultPort.toString) + + var url:String=_ + var user:String=_ + var password:String=_ + var sql:String=_ + var schameString : String=_ + + + override def perform(in: JobInputStream, out: JobOutputStream, pec: JobContext): Unit = { + val session: SparkSession = pec.get[SparkSession]() + + //jdbc:hive2://10.0.82.165:21050/;auth=noSasl + + Class.forName("org.apache.hive.jdbc.HiveDriver") + + val con: Connection = DriverManager.getConnection("jdbc:hive2://"+url+"/;auth=noSasl",user,password) + val stmt: Statement = con.createStatement() + // val rs: ResultSet = stmt.executeQuery("select * from kylin.test1 full join kylin.morg on kylin.test1.pid=kylin.morg.belongtocode") + val rs: ResultSet = stmt.executeQuery(sql) + + val filedNames: Array[String] = schameString.split(",") + var rowsArr:ArrayBuffer[ArrayBuffer[String]]=ArrayBuffer() + while (rs.next()){ + var rowArr:ArrayBuffer[String]=ArrayBuffer() + for(fileName <- filedNames){ + rowArr+=rs.getString(fileName) + } + rowsArr+=rowArr + } + + val fields: Array[StructField] = filedNames.map(d=>StructField(d,StringType,nullable = true)) + val schema: StructType = StructType(fields) + + val rows: List[Row] = rowsArr.toList.map(arr => { + val row: Row = Row.fromSeq(arr) + row + }) + val rdd: RDD[Row] = session.sparkContext.makeRDD(rows) + val df: DataFrame = session.createDataFrame(rdd,schema) + + println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") + df.show(20) + println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") + + out.write(df) + + } + + override def setProperties(map: Map[String, Any]): Unit = { + url = MapUtil.get(map,"url").asInstanceOf[String] + user = MapUtil.get(map,"user").asInstanceOf[String] + password = MapUtil.get(map,"password").asInstanceOf[String] + sql = MapUtil.get(map,"sql").asInstanceOf[String] + schameString = MapUtil.get(map,"schameString").asInstanceOf[String] + + } + + + override def getPropertyDescriptor(): List[PropertyDescriptor] = { + var descriptor : List[PropertyDescriptor] = List() + + val url=new PropertyDescriptor().name("url").displayName("url").description("IP and port number, you need to write like this -- ip:port").defaultValue("").required(true) + descriptor = url :: descriptor + val user=new PropertyDescriptor().name("user").displayName("user").description("").defaultValue("").required(false) + descriptor = user :: descriptor + val password=new PropertyDescriptor().name("password").displayName("password").description("").defaultValue("").required(false) + descriptor = password :: descriptor + val sql=new PropertyDescriptor().name("sql").displayName("sql").description("The name of the table has not changed.But you have to specify which database, such as database.table.").defaultValue("").required(true) + descriptor = sql :: descriptor + val schameString=new PropertyDescriptor().name("schameString").displayName("schameString").description("The field of SQL statement query results is divided by ,").defaultValue("").required(true) + descriptor = schameString :: descriptor + + descriptor + } + + override def getIcon(): Array[Byte] = { + ImageUtil.getImage("impala/impala-logo.png") + } + + override def getGroup(): List[String] = { + List(StopGroupEnum.Mongodb.toString) + } + + override def initialize(ctx: ProcessContext): Unit = { + } + + +} diff --git a/piflow-bundle/src/main/scala/cn/piflow/bundle/internetWorm/spider.scala b/piflow-bundle/src/main/scala/cn/piflow/bundle/internetWorm/spider.scala index c4218b4..6eea32b 100644 --- a/piflow-bundle/src/main/scala/cn/piflow/bundle/internetWorm/spider.scala +++ b/piflow-bundle/src/main/scala/cn/piflow/bundle/internetWorm/spider.scala @@ -214,7 +214,8 @@ class spider extends ConfigurableStop{ } override def getIcon(): Array[Byte] = { - ImageUtil.getImage("spider.jpg") + ImageUtil.getImage("spider.jpeg") + } override def getGroup(): List[String] = { diff --git a/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/ComplementByMemcache.scala b/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/ComplementByMemcache.scala index 819e7cb..a859779 100644 --- a/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/ComplementByMemcache.scala +++ b/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/ComplementByMemcache.scala @@ -14,7 +14,7 @@ import scala.collection.mutable.ArrayBuffer class ComplementByMemcache extends ConfigurableStop { override val authorEmail: String = "yangqidong@cnic.cn" - override val description: String = "get data from mongodb" + override val description: String = "Supplement to Memcache query data" val inportList: List[String] = List(PortEnum.DefaultPort.toString) val outportList: List[String] = List(PortEnum.DefaultPort.toString) diff --git a/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/GetMemcache.scala b/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/GetMemcache.scala index 4e5dd1f..a547670 100644 --- a/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/GetMemcache.scala +++ b/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/GetMemcache.scala @@ -15,7 +15,7 @@ import scala.collection.mutable.ArrayBuffer class GetMemcache extends ConfigurableStop{ override val authorEmail: String = "yangqidong@cnic.cn" - override val description: String = "get data from mongodb" + override val description: String = "get data from memache" val inportList: List[String] = List(PortEnum.DefaultPort.toString) val outportList: List[String] = List(PortEnum.DefaultPort.toString) diff --git a/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/PutMemcache.scala b/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/PutMemcache.scala index 2fb519c..4d69773 100644 --- a/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/PutMemcache.scala +++ b/piflow-bundle/src/main/scala/cn/piflow/bundle/memcache/PutMemcache.scala @@ -9,7 +9,7 @@ import org.apache.spark.sql.{DataFrame, Row, SparkSession} class PutMemcache extends ConfigurableStop{ override val authorEmail: String = "yangqidong@cnic.cn" - override val description: String = "get data from mongodb" + override val description: String = "get data from memcache" val inportList: List[String] = List(PortEnum.DefaultPort.toString) val outportList: List[String] = List(PortEnum.NonePort.toString) diff --git a/piflow-bundle/src/test/scala/cn/piflow/bundle/impala/SelectImpalaTest.scala b/piflow-bundle/src/test/scala/cn/piflow/bundle/impala/SelectImpalaTest.scala new file mode 100644 index 0000000..b8924d5 --- /dev/null +++ b/piflow-bundle/src/test/scala/cn/piflow/bundle/impala/SelectImpalaTest.scala @@ -0,0 +1,65 @@ +package cn.piflow.bundle.impala + +import cn.piflow.Runner +import cn.piflow.conf.bean.FlowBean +import cn.piflow.conf.util.{FileUtil, OptionUtil} +import org.apache.spark.sql.SparkSession +import org.h2.tools.Server +import org.junit.Test + +import scala.util.parsing.json.JSON + +class SelectImpalaTest { + + @Test + def testFlow(): Unit ={ + + //parse flow json + val file = "src/main/resources/impala/SelectImpala.json" + val flowJsonStr = FileUtil.fileReader(file) + val map = OptionUtil.getAny(JSON.parseFull(flowJsonStr)).asInstanceOf[Map[String, Any]] + println(map) + + //create flow + val flowBean = FlowBean(map) + val flow = flowBean.constructFlow() + + val h2Server = Server.createTcpServer("-tcp","-tcpAllowOthers","-tcpPort","50001").start() + + + //execute flow + val spark = SparkSession.builder() + .master("spark://10.0.86.89:7077") + .appName("piflow-hive-bundle") + .config("spark.driver.memory", "1g") + .config("spark.executor.memory", "2g") + .config("spark.cores.max", "2") + .config("spark.jars","/root/Desktop/gitWORK/out/artifacts/piflow_bundle/piflow_bundle.jar") + .enableHiveSupport() + .getOrCreate() + + val process = Runner.create() + .bind(classOf[SparkSession].getName, spark) + .bind("checkpoint.path", "hdfs://10.0.86.89:9000/xjzhu/piflow/checkpoints/") + .start(flow); + + process.awaitTermination(); + val pid = process.pid(); + println(pid + "!!!!!!!!!!!!!!!!!!!!!") + spark.close(); + } + @Test + def testFlow2json() = { + + //parse flow json + val file = "src/main/resources/flow.json" + val flowJsonStr = FileUtil.fileReader(file) + val map = OptionUtil.getAny(JSON.parseFull(flowJsonStr)).asInstanceOf[Map[String, Any]] + + //create flow + val flowBean = FlowBean(map) + val flowJson = flowBean.toJson() + println(flowJson) + } + +}