技术标签: hive java mapreduce Hadoop hadoop big data
(无唯一标准答案,可用中文写清楚每个关键步骤和重要技术点,也可直接写代码,或者中文和代码混合说明)
注意:
①写清方案实行的步骤
②每个步骤的重要技术点,比如用的哪个类来实现
HDFS:分布式文件系统
Yarn:资源调度系统
MapReduce:分布式运算程序开发框架
HIVE:SQL数据仓库工具
HBASE:基于Hadoop的分布式海量数据库
Zookeeper:分布式协调服务基础组件
NameNode
它是hadoop
中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。SecondaryNameNode
它不是namenode
的冗余守护进程,而是提供周期检查点和清理任务。帮助NN合并editslog
,减少NN启动时间。DataNode
它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode
守护进程。ResourceManager
(JobTracker
)是一个仲裁整个集群可用资源的主节点,帮助YARN系统管理其上的分布式应用NodeManager
(TaskTracker
)是运行在单个节点上的代理,它管理Hadoop集群中单个计算节点Hadoop分布式文件系统
9000端口是HDFS默认的端口号,提供文件系统的端口供client角色寻找namenode
角色的端口号,是进程之间的调用50070端口是NameNode
的WebUI默认端口
大文件存储、流式数据访问
大量小文件存储、随机写入(不支持修改内容,但是支持追加内容)、低延迟读取
分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题。
MapReduce由两个阶段组成:Map和Reduce,用户只需要实现map()
和reduce()
两个函数,即可实现分布式计算
大规模数据集的离线批处理计算
实时的交互式计算,要求快速响应,低延迟
是Hadoop2.0中的资源管理系统,它是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度
ResourceManager
节点负责集群资源统一管理和计算框架管理,主要包括调度与应用程序管理NodeManager
节点是节点资源管理监控和容器管理Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING(数值型)类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型
例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;
create database if not exists dbname;
show databases;
desc database extended dbname;
drop database if exists dbname;只能删除空的数据库
drop database if exists dbname cascade;可删除非空数据库
use database_name;
内部表、外部表、分桶表、分区表…
表复制:create table stu_copy like stu_external; stu_copy是内部表
select * from tablename
-- 修改表名。rename
alter table course_common
rename to course_common1;
-- 修改列名。change column
alter table course_common1
change column id cid int;
-- 修改字段类型。change column
alter table course_common1
change column cid cid string;
-- The following columns have types incompatible with the existing columns in their respective positions
-- 修改字段数据类型时,要满足数据类型转换的要求。如int可以转为string,但是string不能转为int
-- 增加字段。add columns
alter table course_common1
add columns (common string);
-- 删除字段:replace columns
-- 这里仅仅只是在元数据中删除了字段,并没有改动hdfs上的数据文件
alter table course_common1
replace columns(
id string, cname string, score int);
-- 删除表
drop table course_common1;
truncate table tablename [partition partition_spec];
Hive创建内部表时,会将数据移动到数据仓库指向的路径。
创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变,在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据
如果数据已经存储在 HDFS 上了,然后需要使用 Hive 去进行分析,并且该份数据还有可能要使用其他的计算引擎做计算之用,请使用外部表
如果一份数据仅仅只是使用 Hive 做统计分析,那么可以使用内部表
从本地导入:
load data local inpath ‘/home/1.txt’ (overwrite)into table student;
从Hdfs
导入:
load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;
查询导入:
create table student1 as select * from student;(也可以具体查询某项数据)
查询结果导入:
insert (overwrite)into table staff select * from track_log;
用insert overwrite导出方式导出到本地或者HDFS中
insert overwrite [local] directory path select_statement
暂不列举
UDF(User-Defined-Function)
一进一出UDAF(User- Defined Aggregation Funcation)
聚集函数,多进一出UDTF(User-Defined Table-Generating Functions)
一进多出get_json_object(string json_string, string path)
函数的定义与使用
返回值:string
参数1:要解析的json的字符串
参数2:$(json字符串的最外层).(map的key)[]( 数组的元素,下标从0开始)* (所有)
eg:
{
"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
取第一列movie的值:$.movie
[{
"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}]
取第一列movie的值:$[0].movie
[[{
"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}]]
取第二列rate的值:$[0][0].rate
hive默认序列化类是LazySimpleSerDe
,其只支持单字节分隔符来加载文本数据。
注:over
才是窗口函数,下面这些函数只是与之搭配的分析函数
ROW_NUMBER()
函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询rank()
:生成数据项在分组中的排名,排名相等会在名次中留下空位。dense_rank()
:生成数据项在分组中的排名,排名相等会在名次中不会留下空位分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)
例子:
select id,name,sex,age,dept,row_number() over(partition by dept order by age desc) index from suttest;
select id,name,sex,age,dept,rank() over(partition by dept order by age desc) ranknum from suttest;
生成数据项在分组中的排名,排名相等会在名次中留下空位
select id,name,sex,age,dept,dense_rank() over(partition by dept order by age desc) ranknum from suttest;
生成数据项在分组中的排名,排名相等会在名次中不会留下空位
常用的聚合函数包括max
、 min
、sum
结构和上面分析函数相同
eg:
① 求整个窗口内部年龄的最大值
select id,name,sex,age,dept,max(age) over(distribute by dept) agemax from suttest;
package com.xishiyou.mytest;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class HdfsMyTest {
public static void main(String[] args) {
try {
Configuration con = new Configuration();
// con.set("dfs.replication","1");
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.200.11:9000"), con, "root");
// 创建文件夹
// fileSystem.mkdirs(new Path("/aaa"));
// 创建文件
// fileSystem.createNewFile(new Path("/aaa/test2.txt"));
// 下载文件
// fileSystem.copyToLocalFile(false,
// new Path("/NOTICE.txt"),
// new Path("D:/NOTICE.txt"),
// true
// );
// 上传文件
// fileSystem.copyFromLocalFile(new Path("D:/b.jpg"),
// new Path("/aaa/b.jpg"));
// 追加内容到文件中
//WINDOWS本地---HDFS
//windows--input--内存--output--HDFS
BufferedInputStream in = new BufferedInputStream(new FileInputStream("D:/NOTICE.txt"));
FSDataOutputStream out = fileSystem.append(new Path("/aaa/test1.txt"));
IOUtils.copyBytes(in,out,4096);
fileSystem.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
HiveTest
继承UDFpackage com.java.hivetest;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUdf extends UDF {
// 三个数相加
public double evaluate(double a,double b,double c){
return a+b+c;
}
// 两个数相乘
public double evaluate(double a,double b) {
return a*b;
}
}
package com.xishiyou.mytest01;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* 前两个泛型LongWritable, Text代表输入Map程序中的Key-value
*后两个泛型Text,LongWritable代表输出Map程序中的Key-value--根据需求规定
* LongWritable→java中的long
* Text→java中的String
* 这些类型都是hadoop自已进行特殊序列化之后的类型,不能采用java的原生类型
*/
public class WordMapTest extends Mapper<LongWritable, Text,Text,LongWritable> {
/**
*map方法执行一次,代表读取一行数据:转换成特定格式
* @param key 进入map方法的key值
* @param value 进入map方法的value值,表示每一行内容
* @param context 上下文 将处理之后的结果,输送到下一个环节
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
System.out.println(key.toString());
//将每一行数据以空格拆分
String[] words = value.toString().split(" ");
//遍历该数据,得到每行中的单词
for (String word:words) {
//按照特定的格式发送给reduce程序
context.write(new Text(word),new LongWritable(1));
}
}
}
package com.xishiyou.mytest01;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class WordReduceTest extends Reducer<Text, LongWritable,Text,LongWritable> {
/**
*
* @param key mapreduce合并后传过来的key
* @param values 进mapreduce给我们进行了合并处理之后的数据key,[1,1,1,1,1,1,1]
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
long result=0L;
// 迭代values,将值相加即可得到总数
for (LongWritable lw:values) {
result+=lw.get();
}
// 迭代相加完成后输出
context.write(key,new LongWritable(result));
}
}
package com.mrqianru.mr1;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class WordJob {
public static void main(String[] args) {
try {
Configuration con = new Configuration();
con.set("fs.defaultFS","hdfs://192.168.200.11:9000");
con.set("dfs.replication","1");
Job job = Job.getInstance(con);
// 为job程序取名字
job.setJobName("单词统计测试");
// 主类的class对象
job.setJarByClass(WordJob.class);
// 关联的mapper类
job.setMapperClass(WordMap.class);
// 关联的reduce类
job.setReducerClass(WordReduce.class);
// 告诉job程序,mapper类的输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
// 告诉job程序,reduce类的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// job.setNumReduceTasks(2);
// 为job设置输入源---hdfs
FileInputFormat.addInputPath(job,new Path("/word.txt"));
Path path = new Path("/word_result");
FileSystem fileSystem = FileSystem.get(con);
if (fileSystem.exists(path)){
fileSystem.delete(path,true);
}
// 为job设置输出源--hdfs
FileOutputFormat.setOutputPath(job,path);
// 启动job
// true表示将运行进度等信息及时输出给用户,false的话只是等待作业结束
boolean flag = job.waitForCompletion(true);
if (flag){
System.out.println("执行完成");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
package com.xishiyou.mytest02;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class OrderMap extends Mapper<LongWritable, Text,Text,OrderWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 按照tab键拆分
String[] orders = value.toString().split("\t");
// 设置orderWritable
OrderWritable ow = new OrderWritable();
ow.setPrice(Double.parseDouble(orders[1]));
ow.setNum(Integer.parseInt(orders[2]));
ow.setTotalPrice(Double.parseDouble(orders[3]));
// 输出
context.write(new Text(orders[0]),ow);
}
}
package com.xishiyou.mytest02;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class OrderReduce extends Reducer<Text,OrderWritable,Text,OrderWritable> {
@Override
protected void reduce(Text key, Iterable<OrderWritable> values, Context context) throws IOException, InterruptedException {
for (OrderWritable ow:values) {
// 设置价格*2,得出总价
ow.setPrice(ow.getPrice()*2);
ow.setTotalPrice(ow.getPrice()*ow.getNum());
// 输出
context.write(key,ow);
}
}
}
package com.xishiyou.mytest02;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
//自定义类型
public class OrderWritable implements Writable {
// 单价
private double price;
// 数量
private int num;
// 销售额
private double totalPrice;
//提供getter和setter方法
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public double getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(double totalPrice) {
this.totalPrice = totalPrice;
}
// 重写toString方法
@Override
public String toString() {
return price + "\t" + num + "\t" + totalPrice ;
}
// 以下两个方法里面的顺序要与定义时一致
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeDouble(price);
dataOutput.writeInt(num);
dataOutput.writeDouble(totalPrice);
}
@Override
public void readFields(DataInput dataInput) throws IOException {
price = dataInput.readDouble();
num=dataInput.readInt();
totalPrice=dataInput.readDouble();
}
}
package com.xishiyou.mytest02;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class OrderJob {
public static void main(String[] args) {
try {
// 设置参数
Configuration config = new Configuration();
config.set("fs.defaultFS","hdfs://192.168.200.11:9000");
config.set("dfs.repliaction","1");
// 获取job对象
Job job = Job.getInstance(config, "订单案例");
// 获取三个类
job.setJarByClass(OrderJob.class);
job.setMapperClass(OrderMap.class);
job.setReducerClass(OrderReduce.class);
// 设置map和reduce的输出
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(OrderWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(OrderWritable.class);
// 设置输入源
FileInputFormat.addInputPath(job,new Path("/order.txt"));
// 设置输出目的地
Path outPath=new Path("/order_result");
FileSystem fileSystem = FileSystem.get(config);
if (fileSystem.exists(outPath)){
fileSystem.delete(outPath,true);
}
FileOutputFormat.setOutputPath(job,outPath);
// 启动
boolean b = job.waitForCompletion(true);
if (b){
System.out.println("执行成功");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
注释可以不用管
public static void main(String[] args) {
try {
Configuration con = new Configuration();
// con.set("dfs.replication","1");
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.200.11:9000"), con, "root");
// 创建文件夹
// fileSystem.mkdirs(new Path("/aaa"));
// 创建文件
// fileSystem.createNewFile(new Path("/aaa/test2.txt"));
// 下载文件
// fileSystem.copyToLocalFile(false,
// new Path("/NOTICE.txt"),
// new Path("D:/NOTICE.txt"),
// true
// );
// 上传文件
// fileSystem.copyFromLocalFile(new Path("D:/b.jpg"),
// new Path("/aaa/b.jpg"));
// 追加内容到文件中
//WINDOWS本地---HDFS
//windows--input--内存--output--HDFS
BufferedInputStream in = new BufferedInputStream(new FileInputStream("D:/NOTICE.txt"));
FSDataOutputStream out = fileSystem.append(new Path("/aaa/test1.txt"));
IOUtils.copyBytes(in,out,4096);
fileSystem.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
System.out.println(key.toString());
//将每一行数据以空格拆分
String[] words = value.toString().split(" ");
//遍历该数据,得到每行中的单词
for (String word:words) {
//按照特定的格式发送给reduce程序
context.write(new Text(word),new LongWritable(1));
}
}
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
long result=0L;
// 迭代values,将值相加即可得到总数
for (LongWritable lw:values) {
result+=lw.get();
}
// 迭代相加完成后输出
context.write(key,new LongWritable(result));
}
public static void main(String[] args) {
try {
Configuration con = new Configuration();
con.set("fs.defaultFS","hdfs://192.168.200.11:9000");
con.set("dfs.replication","1");
Job job = Job.getInstance(con);
// 为job程序取名字
job.setJobName("单词统计测试");
// 主类的class对象
job.setJarByClass(WordJob.class);
// 关联的mapper类
job.setMapperClass(WordMap.class);
// 关联的reduce类
job.setReducerClass(WordReduce.class);
// 告诉job程序,mapper类的输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
// 告诉job程序,reduce类的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// job.setNumReduceTasks(2);
// 为job设置输入源---hdfs
FileInputFormat.addInputPath(job,new Path("/word.txt"));
Path path = new Path("/word_result");
FileSystem fileSystem = FileSystem.get(con);
if (fileSystem.exists(path)){
fileSystem.delete(path,true);
}
// 为job设置输出源--hdfs
FileOutputFormat.setOutputPath(job,path);
// 启动job
// true表示将运行进度等信息及时输出给用户,false的话只是等待作业结束
boolean flag = job.waitForCompletion(true);
if (flag){
System.out.println("执行完成");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] orders = value.toString().split("\t");
OrderWritable ow = new OrderWritable();
ow.setPrice(Double.parseDouble(orders[1]));
ow.setNum(Integer.parseInt(orders[2]));
ow.setTotalPrice(Double.parseDouble(orders[3]));
context.write(new Text(orders[0]),ow);
}
protected void reduce(Text key, Iterable<OrderWritable> values, Context context) throws IOException, InterruptedException {
for (OrderWritable ow:values) {
ow.setPrice(ow.getPrice()*2);
ow.setTotalPrice(ow.getPrice()*ow.getNum());
context.write(key,ow);
}
}
// 重写toString方法
@Override
public String toString() {
return price + "\t" + num + "\t" + totalPrice ;
}
// 以下两个方法里面的顺序要与定义时一致
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeDouble(price);
dataOutput.writeInt(num);
dataOutput.writeDouble(totalPrice);
}
@Override
public void readFields(DataInput dataInput) throws IOException {
price = dataInput.readDouble();
num=dataInput.readInt();
totalPrice=dataInput.readDouble();
}
方案设计题就是,比如说给你一堆比较复杂的需要处理的数据,要你存到hdfs
上,然后查询出某种想要的结果。答题可以用中文回答或者写代码写hql
都可以,比如存到hdfs
上时,第一步要干嘛,第二步干嘛,大概写出每一步有可能涉及的技术关键字就行。
大数据代码题主要看方法的具体实现和重点类名就行,方法声明,环境配置之类的不需要看,方案设计题没有唯一答案,也没有固定的作答方式,只需要写好每个重点步骤和步骤大概用到什么知识点就行,也可以直接写代码
Configuration
对象并初始化参数FileSystem
创建文件系统实例Path
创建文件实例FSDataOutputStream
的输出流对象**os.write
函数写入数据close()
函数关闭输出流和文件系统代码实现:
try{
//加载配置项
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
//创建文件系统实例
FileSystem fs = FileSystem.get(conf);
//创建文件实例
String fileName = "test";
Path file = new Path(fileName);
//创建输出流对象
FSDataOutputStream os = fs.create(file);
//写入数据
byte[] buff = "Hello World".getBytes();
os.write(buff, 0, buff.length);
System.out.println("Create:"+fileName);
//关闭输出流和文件系统
os.close();
fs.close();
} catch (Exception e){
e.printStackTrace();
}
hadoop fs -put test.txt /data/test
select
或者其他查询语句筛选我们想要的结果文章浏览阅读1.6k次,点赞5次,收藏20次。【有害垃圾】:电池(1 号、2 号、5 号)、过期药品或内包装等;【可回收垃圾】:易拉罐、小号矿泉水瓶;【厨余垃圾】:小土豆、切过的白萝卜、胡萝卜,尺寸为电池大小;【其他垃圾】:瓷片、鹅卵石(小土豆大小)、砖块等。文件结构|----classes.txt # 标签种类|----data-txt\ # 数据集文件集合|----images\ # 数据集图片|----labels\ # yolo标签。_垃圾回收数据集
文章浏览阅读272次。之前写到 通过封装的API 已经可以做到使用redis进行缓存天气信息但是这一操作每次都由客户使用时才进行更新 不友好 所以应该自己实现半小时的定时存入redis 使用quartz框架 首先添加依赖build.gradle中// Quartz compile('org.springframework.boot:spring-boot-starter-quartz'..._cityid=101280803
文章浏览阅读1.8k次,点赞2次,收藏8次。对于使用触发事件来反应的按钮传递参数如下:可以通过lambda对function的参数传递:t.Bind(wx.EVT_BUTTON, lambda x, textctrl=t: self.input_fun(event=x, textctrl=textctrl))前提需要self.input_fun(self,event,t):传入参数而同时两个Frame之间的参数传..._wxpython frame.bind
文章浏览阅读1.9k次。最近接到一个任务要开发消消乐小游戏,当然首先就想到乐cocosCreator来作为开发工具。开发本身倒没有多少难点。消消乐的开发官网发行的书上有专门讲到。下面主要总结一下开发中遇到的问题以及解决方法屏幕适配由于设计尺寸是750*1336,如果适应高度,则在iphonX下,内容会超出屏幕宽度。按宽适应,iphon4下内容会超出屏幕高度。所以就需要根据屏幕比例来动态设置适配策略。 onLoad..._750*1336
文章浏览阅读745次,点赞21次,收藏21次。web项目的框架,通常更简单的数据源。21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对银行贷款管理系统进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统的设计目标进行了论述,还有系统的需求,以及整个的设计方案,对系统的设计以及实现,也都论述的比较细致,最后对银行贷款管理系统进行了一些具体测试。_vue3重构信贷管理系统
文章浏览阅读774次。题目描述原题目戳这里小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。乌龟棋的棋盘是一行 NNN 个格子,每个格子上一个分数(非负整数)。棋盘第 111 格是唯一的起点,第 NNN 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中 MMM 张爬行卡片,分成 444 种不同的类型( MMM 张卡片中不一定包含所有 444 种类型的卡片,见样例),每种类型的卡片上分别标有 1,2,3,41, 2, 3, 41,2,3,4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数
文章浏览阅读1.5k次。吐槽内存泄露 ? 内存暴涨 ? OOM ?首先提一下我自己曾经历过多次内存泄露,到底有几次? 我自己心里悲伤的回想了下,造成线上影响的内存泄露事件有将近5次了,没上线就查出内存暴涨次数可能更多。这次不是最惨,相信也不会是最后的内存的泄露。有人说,内存泄露对于程序员来说,是个好事,也是个坏事。 怎么说? 好事在于,技术又有所长进,经验有所心得…. 毕竟不是所有程序员都写过OOM的服务…. 坏事..._python内存泄露
文章浏览阅读747次。1.sensor typeTYPE_ACCELEROMETER=1 TYPE_MAGNETIC_FIELD=2 (what's value mean at x and z axis)TYPE_ORIENTATION=3TYPE_GYROSCOPE=4 TYPE_LIGHT=5(in )TYPE_PRESSURE=6TYPE_TEMPERATURE=7TYPE_PRO_draft sensor
文章浏览阅读581次。/* * Copyright (c) 2009 湖南师范大学数计院 一心飞翔项目组 * All Right Reserved * * 文件名:matrix.cpp 定义Point、Node、Matrix类的各个方法 * 摘 要:定义矩阵类,包括矩阵的相关信息和方法 * * 作 者:刘 庆 * 修改日期:2009年7月19日21:15:12 **/
文章浏览阅读1.7w次,点赞6次,收藏20次。HTML不再推荐页面中使用框架集,因此HTML5删除了<frameset>、<frame>和<noframes>这三个元素。不过HTML5还保留了<iframe>元素,该元素可以在普通的HTML页面中使用,生成一个行内框架,可以直接放在HTML页面的任意位置。除了指定id、class和style之外,还可以指定如下属性:src 指定一个UR..._iframe allow-top-navigation
文章浏览阅读785次,点赞29次,收藏12次。Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,
文章浏览阅读358次。“随着天网工程的建设,中国已经建成世界上规模最大的视频监控网,摄像头总 数超过2000万个,成为世界上最安全的国家。视频图像及配套数据已经应用在反恐维稳、治安防控、侦查破案、交通行政管理、服务民生等各行业各领域。烁博科技视频安全核心能力:精准智能数据采集能力:在建设之初即以应用需求为导向,开展点位选择、设备选型等布建工作,实现前端采集设备的精细化部署。随需而动的AI数据挖掘能力:让AI所需要的算力、算法、数据、服务都在应用需求的牵引下实现合理的调度,实现解析能力的最大化。完善的数据治理能力:面_2018年8月由于某知名视频监控厂商多款摄像机存在安全漏洞