大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息
1 RDD编程实战案例一
数据样例
字段说明:
其中cid中1代表手机,2代表家具,3代表服装
1.1 计算订单分类成交金额
需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称,统计出某一天商品各个分类的成交金额,并保存至Mysql中
(1)法一,将json数据解析出来,直接使用
object IncomeKpi {
private val logger: Logger = LoggerFactory.getLogger(IncomeKpi.getClass)
def main(args: Array[String]): Unit = {
val isLocal = args(0).toBoolean
// 创建SparkContext
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName)
if(isLocal){
conf.setMaster("local[*]")
}
val sc: SparkContext = new SparkContext(conf)
// 使用SparkContext创建RDD
val lines: RDD[String] = sc.textFile(args(1))
val tpRDD: RDD[(Int, Double)] = lines.map(line => {
var tp = (-1, 0.0)
var jsonObj: JSONObject = null
// 使用FastJSON解析数据
try {
jsonObj= JSON.parseObject(line)
val cid: Int = jsonObj.getInteger("cid").toInt
val money: Double = jsonObj.getDouble("money").toDouble
tp = (cid, money)
} catch {
case e:JSONException => {
// 处理有问题的数据
logger.error("parse json error: => " + line)
}
}
tp
})
val reduced: Array[(Int, Double)] = tpRDD.reduceByKey(_+_).collect()
println(reduced.toBuffer)
}
}
运行结果:
发现有个不要的数据没被过滤掉,此处自己还不知道不要的数据怎么处理掉
(2)法二,定义一个bean去保存解析json数据得到的字段,需要时再取出来(此处的bean用case class,这样方便点,不需要序列化)
这里有两种做法,使用foreach将数据一条一条拿出来(每拿一条数据会与数据库建立一个连接),效率比较低,所以使用foreachPartition,foreach直接取出rdd的kv对,而foreachPartition为迭代器
Foreach与foreachPartition的区别
Foreach与foreachPartition都是在每一个partition中对iterator进行操作,
不同的是,foreach是直接在每一个partition中直接对iterator运行foreach操作,而传入的function仅仅是在foreach内部使用,
而foreachPartition是在每一个partition中把iterator给传入的function,让function自己对iterator进行处理.
foreach
object IncomeKpi2 {
private val logger: Logger = LoggerFactory.getLogger(IncomeKpi2.getClass)
def main(args: Array[String]): Unit = {
val isLocal: Boolean = args(0).toBoolean
// 创建SparkContext
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName)
if(isLocal){
conf.setMaster("local[*]")
}
val sc: SparkContext = new SparkContext(conf)
// 使用sc创建rdd
val lines: RDD[String] = sc.textFile(args(1))
// 使用fastJson解析json数据,将数据封装到bean中
val beanRDD: RDD[IncomeBean] = lines.map(line => {
var bean:IncomeBean = null
try {
bean = JSON.parseObject(line, classOf[IncomeBean])
} catch {
case e: JSONException => {
logger.error("parse json error")
}
}
bean
})
// 过滤掉不需要的数据
val filtered: RDD[IncomeBean] = beanRDD.filter(_ != null)
// 将数据转成元组形式
val cidAndMoneyRDD: RDD[(Int, Double)] = filtered.map(bean => {
val cid: Int = bean.cid.toInt
val money: Double = bean.money
(cid, money)
})
// 分组聚合
val reduced: RDD[(Int, Double)] = cidAndMoneyRDD.reduceByKey(_+_)
// 再次创建一个RDD,用来读取分类文件
val cLines: RDD[String] = sc.textFile(args(2))
val cidAndCName: RDD[(Int, String)] = cLines.map(line => {
val split: Array[String] = line.split(",")
val cid: Int = split(0).toInt
val cname: String = split(1)
(cid, cname)
})
// 将两个rdd使用join关联起来
val joined: RDD[(Int, (Double, String))] = reduced.join(cidAndCName)
// 对join后的数据进行处理
val res: RDD[(String, Double)] = joined.map(t => (t._2._2, t._2._1)) res.foreach(dataToMySQL)
} // 创建用于连接数据库并将res结果存入数据库的函数
val dataToMySQL: ((String, Double)) => Unit = (t:(String, Double)) => {
var ps: PreparedStatement = null
var conn: Connection = null
// 创建一个Connection
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user?characterEncoding=UTF-8",
"root",
"feng")
// 对sql语句进行预编译,并插入相应的数据
ps = conn.prepareStatement("insert into t_result values (null,?,?,?)")
ps.setString(1, t._1)
ps.setDouble(2, t._2)
ps.setDate(3, new Date(System.currentTimeMillis()))
// 执行
ps.executeUpdate()
} catch{
case e:SQLException => {
// 有误的数据
}
} finally{
// 释放MySQL的资源
if (ps != null){
ps.close()
}
if (conn != null) {
conn.close()
}
}
()
}
}
foreachPartition(与foreach的区别就是从rdd中获取数据有点不一样)
object IncomeKpi3 {
private val logger: Logger = LoggerFactory.getLogger(IncomeKpi2.getClass)
def main(args: Array[String]): Unit = {
val isLocal: Boolean = args(0).toBoolean
// 创建SparkContext
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName)
if(isLocal){
conf.setMaster("local[*]")
}
val sc: SparkContext = new SparkContext(conf)
// 使用sc创建rdd
val lines: RDD[String] = sc.textFile(args(1))
// 使用fastJson解析json数据,将数据封装到bean中
val beanRDD: RDD[IncomeBean] = lines.map(line => {
var bean:IncomeBean = null
try {
bean = JSON.parseObject(line, classOf[IncomeBean])
} catch {
case e: JSONException => {
logger.error("parse json error")
}
}
bean
})
// 过滤掉不需要的数据
val filtered: RDD[IncomeBean] = beanRDD.filter(_ != null)
// 将数据转成元组形式
val cidAndMoneyRDD: RDD[(Int, Double)] = filtered.map(bean => {
val cid: Int = bean.cid.toInt
val money: Double = bean.money
(cid, money)
})
// 分组聚合
val reduced: RDD[(Int, Double)] = cidAndMoneyRDD.reduceByKey(_+_)
// 再次创建一个RDD,用来读取分类文件
val cLines: RDD[String] = sc.textFile(args(2))
val cidAndCName: RDD[(Int, String)] = cLines.map(line => {
val split: Array[String] = line.split(",")
val cid: Int = split(0).toInt
val cname: String = split(1)
(cid, cname)
})
// 将两个rdd使用join关联起来
val joined: RDD[(Int, (Double, String))] = reduced.join(cidAndCName)
// 对join后的数据进行处理
val res: RDD[(String, Double)] = joined.map(t => (t._2._2, t._2._1)) res.foreachPartition(dataToMySQL)
} // 创建用于连接数据库并将res结果存入数据库的函数
val dataToMySQL = (it:Iterator[(String, Double)]) => {
var ps: PreparedStatement = null
var conn: Connection = null
// 创建一个Connection
try {
it.foreach( t =>{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user?characterEncoding=UTF-8",
"root",
"feng")
// 对sql语句进行预编译,并插入相应的数据
ps = conn.prepareStatement("insert into t_result values (null,?,?,?)")
ps.setString(1, t._1)
ps.setDouble(2, t._2)
ps.setDate(3, new Date(System.currentTimeMillis()))
// 执行
ps.executeUpdate()
})
} catch{
case e:SQLException => {
// 有误的数据
}
} finally{
// 释放MySQL的资源
if (ps != null){
ps.close()
}
if (conn != null) {
conn.close()
}
}
()
}
}
1.2 将订单数据关联分类信息,然后将一些数据存放到Hbase中
OrderDetailToHbase
package com._51doit.spark03 import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
import java.util import com._51doit.spark02.bean.IncomeBean
import com._51doit.utils.HBaseUtil
import com.alibaba.fastjson.{JSON, JSONException}
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.{TableName, client}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} object OrderDetailToHbase {
def main(args: Array[String]): Unit = {
System.setProperty("HADOOP_USER_NAME", "root")
val isLocal = args(0).toBoolean
//创建SparkConf,然后创建SparkContext
val conf = new SparkConf().setAppName(this.getClass.getSimpleName)
if (isLocal) {
conf.setMaster("local[*]")
}
val sc = new SparkContext(conf)
//创建RDD
val lines: RDD[String] = sc.textFile(args(1))
val beanRDD: RDD[IncomeBean] = lines.map(line => {
var bean: IncomeBean = null
try {
bean = JSON.parseObject(line, classOf[IncomeBean])
} catch {
case e: JSONException => {
//单独处理
}
}
bean
})
//过滤有问题的数据
val filtered: RDD[IncomeBean] = beanRDD.filter(_ != null)
// 使用分区创建一个数据库连接,再使用这个连接查询信息
val result: RDD[IncomeBean] = filtered.mapPartitions((it: Iterator[IncomeBean]) => {
if(it.nonEmpty) {
val conn: Connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user?characterEncoding=UTF-8", "root", "feng")
val ps: PreparedStatement = conn.prepareStatement("SELECT cname FROM t_category WHERE cid = ?")
// 根据bean中的cid查找对应的分类名
it.map(bean => {
ps.setInt(1, bean.cid)
val resultSet: ResultSet = ps.executeQuery()
//获取rs中的结果
var name: String = null
while (resultSet.next()) {
name = resultSet.getString("cname")
}
bean.categoryName = name
//进行判断,如果迭代器中已经没有数据了,关闭连接
if (resultSet != null) {
resultSet.close()
}
if (!it.hasNext) {
if (ps != null) {
ps.close()
}
if (conn != null) {
conn.close()
}
}
bean
})
} else{ // 直接返回空迭代器
it
}
})
//将数据保存到Hbase中
result.foreachPartition(it => {
// 创建一个Hbase的连接
val connection: client.Connection = HBaseUtil.getConnection("feng01,feng02,feng03", 2181)
val table = connection.getTable(TableName.valueOf("t_order"))
val puts = new util.ArrayList[Put]()
//遍历迭代器中的数据
it.foreach(bean => {
//设置数据,包括rk
val put = new Put(Bytes.toBytes(bean.oid))
//设置列族的数据
put.addColumn(Bytes.toBytes("order_info"), Bytes.toBytes("category_name"), Bytes.toBytes(bean.categoryName))
put.addColumn(Bytes.toBytes("order_info"), Bytes.toBytes("money"), Bytes.toBytes(bean.money))
//将put放入到puts这个list中
puts.add(put)
if(puts.size() == 100) {
//将数据写入到Hbase中
table.put(puts)
//清空puts集合中的数据
puts.clear()
}
})
//将没有达到100的数据也写入到Hbase中
table.put(puts)
//关闭Hbase连接
connection.close()
})
sc.stop()
} }
HBaseUtil:用来创建HBase的连接
package com._51doit.utils import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.{Connection, ConnectionFactory} /**
* Hbase的工具类,用来创建Hbase的Connection
*/
object HBaseUtil extends Serializable {
/**
* @param zkQuorum zookeeper地址,多个要用逗号分隔
* @param port zookeeper端口号
* @return
*/
def getConnection(zkQuorum: String, port: Int): Connection = synchronized {
val conf = HBaseConfiguration.create()
conf.set("hbase.zookeeper.quorum", zkQuorum)
conf.set("hbase.zookeeper.property.clientPort", port.toString)
ConnectionFactory.createConnection(conf)
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com._51doit</groupId>
<artifactId>spark01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 定义了一些常量 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<scala.version>2.11.12</scala.version>
<spark.version>2.3.3</spark.version>
<hadoop.version>2.8.5</hadoop.version>
<encoding>UTF-8</encoding>
</properties> <dependencies>
<!-- 导入scala的依赖 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- 导入fastJson的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.57</version>
</dependency>
<!-- 导入mysql的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 导入spark的依赖,core指的是RDD编程API -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.5</version>
</dependency> <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.8.5</version>
</dependency> <!-- 导入hbase的依赖 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.0.4</version>
</dependency>
</dependencies> <build>
<pluginManagement>
<plugins>
<!-- 编译scala的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 编译java的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin> <!-- 打jar插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>
此处自己出现的问题:
- 依赖的冲突
使用maven管理库的依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar包会被下载不同版本的问题。解决方法就是在pom的配置文件中用<execlusion>来排除一些不需要同时下载的依赖jar包
<!-- 导入spark的依赖,core指的是RDD编程API -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
</exclusion>
</exclusions>
</dependency>
- Hbase开启出现问题
开启Hbase的前提是一定要先开启zookeeper和hdfs文件系统(zookeeper先于hdfs启动)
运行结果:
1.3 使用Spark读取日志文件,根据IP地址,查询日志文件中的IP地址对应的位置信息 ,并统计处各个省份的用户量
日志文件
ip文件(ip规则数据)
说明:此处加载ip规则数据若以rdd的形式的话(sc.textFile(文件路径)),由于ip规则数据会被切片成多块,这样每个task就会加载ip规则数据中的一部分,这样的话,当进行ip关联的时候(日志文件中的ip找对应的省份等信息),就可能关联不到需要的信息,ip规则数据越大,日志文件中的ip关联不到对应的信息的可能性越大(ip规则数据越大,切片的数量就会越大,相应的分区也就越多,意味着task的数量也会越多,每个task中读取到的数据占总数据的比例就会减少)。所以说,使用rdd的形式读取ip规则数据不可行,那么该怎么办呢?
直接的想法是直接通过IO流读取ip规则数据,并保存至内存中,可以改进的一点是使用静态代码块,这样一个executor中的多个task使用这些ip规则数据时只需要加载一次ip规则数据(其他task能直接获取到数据地址的引用)。
IpRulesLoader(此处使用静态代码块,加载IP数据(从hdfs中读取),在Ececutor的类加载时执行一次),经过此代码处理后得到数组 ArrayBuffer[(Long, Long, String, String)],参数依次对应起始IP, 结束IP 省份名 城市名
package com._51doit.spark03 import java.io.{BufferedReader, InputStreamReader}
import java.net.URI import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FSDataInputStream, FileSystem, Path} import scala.collection.mutable.ArrayBuffer object IpRulesLoader {
// 定义一个数组用来存放处理好的数据
private val ipRules: ArrayBuffer[(Long, Long, String, String)] = new ArrayBuffer[(Long,Long,String,String)]()
//加载IP规则数据,在Executor的类加载是执行一次
//静态代码块
{
//读取HDFS中的数据
val fileSystem: FileSystem = FileSystem.get(URI.create("hdfs://feng05:9000"), new Configuration())
val inputStream: FSDataInputStream = fileSystem.open(new Path("/ip/ip.txt"))
val br: BufferedReader = new BufferedReader(new InputStreamReader(inputStream))
var line:String = null
do {
line = br.readLine()
if(line != null) {
//处理IP规则数据
val fields = line.split("[|]")
val startNum = fields(2).toLong
val endNum = fields(3).toLong
val province = fields(6)
val city = fields(7)
val t = (startNum, endNum, province, city)
ipRules += t
}
} while(line != null)
}
def getAllRules: ArrayBuffer[(Long, Long, String, String)] ={
ipRules
}
}
注意,此处不能使用while来读取数据,要是用do while
IpLocation:
package com._51doit.spark03 import com._51doit.utils.IpUtils
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext} import scala.collection.mutable.ArrayBuffer object IpLocation {
def main(args: Array[String]): Unit = {
// 决定是否本地运行
val isLocal = args(0).toBoolean
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName)
if(isLocal){
conf.setMaster("local[*]")
}
// 创建sc,读取日志信息,得到相应的rdd
val sc: SparkContext = new SparkContext(conf)
val lines: RDD[String] = sc.textFile(args(1))
// 处理日志信息
val provinceAndOne: RDD[(String, Int)] = lines.map(line => {
val split: Array[String] = line.split("\\|")
// 获取ip地址,并将ip地址转换成Long的形式
val ipStr: String = split(1)
val ipLong: Long = IpUtils.ip2Long(ipStr)
// 获取Ip规则
val allRules: ArrayBuffer[(Long, Long, String, String)] = IpRulesLoader.getAllRules
val index: Int = IpUtils.binarySearch(allRules, ipLong)
var province: String = "未知"
if (index != -1) {
province = allRules(index)._3 }
(province, 1)
})
// 按照省份进行聚合
val result: RDD[(String, Int)] = provinceAndOne.reduceByKey(_+_)
//将计算好的数据保存到MySQL
println(result.collect().toBuffer)
sc.stop() }
}
IpUtils(将ip转成十进制,二进制查找相应地址信息,从而获取对应的省份信息)
package com._51doit.utils import scala.collection.mutable.ArrayBuffer object IpUtils { /**
* 将IP地址转成十进制
*
* @param ip
* @return
*/
def ip2Long(ip: String): Long = {
val fragments = ip.split("[.]")
var ipNum = 0L
for (i <- 0 until fragments.length) {
ipNum = fragments(i).toLong | ipNum << 8L
}
ipNum
} /**
* 二分法查找
*
* @param lines
* @param ip
* @return
*/
def binarySearch(lines: ArrayBuffer[(Long, Long, String, String)], ip: Long): Int = {
var low = 0 //起始
var high = lines.length - 1 //结束
while (low <= high) {
val middle = (low + high) / 2
if ((ip >= lines(middle)._1) && (ip <= lines(middle)._2))
return middle
if (ip < lines(middle)._1)
high = middle - 1
else {
low = middle + 1
}
}
-1 //没有找到
}
}
运行结果:
大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息的更多相关文章
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- spark 分析日志文件(key,value)
Spark读取日志,统计每个service所用的平均时间 发布时间:2015-12-10 9:54:15来源:分享查询网 获取log日志,每个service以“#*#”开头.统计每个service所需 ...
- Java实时读取日志文件
古怪的需求 在实习的公司碰到一个古怪的需求:在一台服务器上写日志文件,每当日志文件写到一定大小时,比如是1G,会将这个日志文件改名成另一个名字,并新建一个与原文件名相同的日志文件,再往这个新建的日志文 ...
- 【spark 深入学习 05】RDD编程之旅基础篇-01
---------------- 本节内容 1.RDD的工作流程 2.WordCount解说 · shell版本WordCount · java版本WordCount -------------- ...
- 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka
1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...
- Spark处理日志文件常见操作
spark有自己的集群计算技术,扩展了hadoop mr模型用于高效计算,包括交互式查询和 流计算.主要的特性就是内存的集群计算提升计算速度.在实际运用过程中也当然少不了对一些数据集的操作.下面将通过 ...
- 5.4 RDD编程---综合案例
一.求top值 任务描述:求出多个文件中数值的最大.最小值 二.求最大最小值 任务描述:求出多个文件中数值的最大.最小值 解题思路:通过一个人造的key,让所有的值都成为“key”的value-lis ...
- 在sqlserver2005/2008中备份数据库,收缩日志文件
---1.先备份数据库(含日志文件) use myhis go backup database myhis to disk='d:\myhis_rzbak' go ---2.设为简单恢复模式 use ...
- flume读取日志文件并存储到HDFS
配置hadoop环境 配置flume环境 配置flume文件 D:\Soft\apache-flume-1.8.0-bin\conf 将 flume-conf.properties.template ...
随机推荐
- scrapy 的response 的相关属性
Scrapy中response介绍.属性以及内容提取 解析response parse()方法的参数 response 是start_urls里面的链接爬取后的结果.所以在parse()方法中,我 ...
- Apache Shiro 反序列化漏洞分析
Shiro550 环境搭建 参考:https://www.cnblogs.com/twosmi1e/p/14279403.html 使用Docker vulhub中的环境 docker cp 将容器内 ...
- 3组-Alpha冲刺-1/6
一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 组织会议,讨论了alpha冲刺的分工,确定了收集数据的渠道,为拍 ...
- 大爽Python入门教程 2-3 字符串,列表,字典
大爽Python入门公开课教案 点击查看教程总目录 除了通用的序列方法, 列表和字符串还有些自己的专属方法. 后面介绍有些是英中文对照介绍(英文来自官方文档), 便于大家更深入的去理解其意思. 灵活的 ...
- 『学了就忘』Linux软件包管理 — 43、RPM包的校验和证书
目录 1.RPM包的校验 (1)RPM包校验基本命令 (2)校验某个系统文件是否被修改举例 (3)验证内容中8个信息的具体内容 (4)文件类型有哪些 2.RPM包的证书 (1)数字证书 (2)数字证书 ...
- 修改eclipse中注释字体而不影响代码字体
eclipse的注释字体大小如何修改?不改变代码的字体 貌似没有直接的办法,但是可以取个巧: Window --> Preferences --> General --> Appea ...
- 说下我费了几个钟头才搞定的myeclipse和tomcat问题
配置myeclipse与tomcat的时候,我根本没有想到myeclipse已经集成了tomcat,根据我上篇文章可以找到所集成的tomcat的位置.于是,自己下了一个tomcat,也许是自作聪明吧, ...
- [atARC121D]1 or 2
对于大小为1的集合,我们可以在其中加入0 因此,枚举0的个数,那么问题即可以看作要求每一个集合大小为2 (特别的,我们允许存在$\{0,0\}$,因为这样删除这两个0显然只会减小极差) 显然此时贪心将 ...
- [51nod1587]半现串
将s所有长度为d/2的子串放进ac自动机中,直接匹配就可以判定半现串了再对其做一个差分,询问一个前缀的半现串个数,在ac自动机上数位dp,f[i][j][0/1]表示走了i步(i位的字符串),走到节点 ...
- 简单的MISC,writerup
(Tips:此题是我自己出给新生写的题目) 解压压缩包,发现两个文件,一个压缩包一个图片 尝试解压,发现有密码,正常思路及密码被藏在了图片里 把图片拉进010editor,无发现,再拉进stegsol ...