CSDN|42 张图带你揭秘后端技术都要学啥?( 八 )

CSDN|42 张图带你揭秘后端技术都要学啥?
本文插图
SQL注入server处理计算后向数据库提交的SQL如下:Select id from users where username='Mike';http://www.a.com?username=Mike';drop table users;--Select id from users where username='Mike';drop table users;--';查询完就直接给删除表了 。 怎么防护?比较常用的解决方案是使用PrepareStaement预编译 , 先将SQL交给数据库生成执行计划 , 后面hack不管提交什么字符串也只能交给这个执行计划执行 , 不会生成新的SQL , 也就不会被攻击啦 。 XSS攻击跨站点脚本攻击 , 攻击者通过构造恶意的浏览器脚本文件 , 使其在其他用户的浏览器运行进而进行攻击 。 假设小A将含有恶意脚本的请求给360服务器 , 服务器将恶意的脚本存储在本地的数据库 , 当其他正常用户通过这个服务器浏览信息的时候 , 服务器就会读取数据库中含有恶意脚本的数据并呈现给用户 , 在用户正常使用浏览器的时候达到攻击的目的 。 防御:比较常见的是在入口处对危险的请求比如drop table等进行拦截 , 设置一个Web应用防火墙将危险隔离 。 CSDN|42 张图带你揭秘后端技术都要学啥?
本文插图
安全防御
大数据其实在上面提到的分布式中就有涉及大数据相关知识 。 无外乎是数据量越来越大 , 我们如何尽可能使用较低的成本存储更多的数据 , 给公司企业带来更好的利润 。 上面说过分布式缓存 , 负载均衡等技术 , 其共同特点是如何抵抗高并发的压力 , 而这里的大数据技术主要谈论的是如何满足大规模的计算 。 通过对数据的分析 , 进而发掘海量数据中的价值 , 这里的数据包含数据库数据 , 日志信息 , 用户行为数据等等 。 那么这么多不同类型的数据 , 怎么去存储呢?分布式文件存储 HDFS 架构如何将数以万计的服务器组成统一的文件存储系统?其中使用Namenode服务器作为控制块 , 负责元数据的管理(记录文件名 , 访问权限 , 数据存储地址等) , 而真正的文件存储在DataNode中 。 Mapreduce大量的数据存储下来的目的是通过相应的算法进行数据分析 , 获得通过深度学习/机器学习进行预测 , 从而获取有效的价值 , 这么大的文件 , 我们不可能将HDFS当做普通的文件 , 从文件中读取数据然后计算 , 这样子不知道算到何时何地 。 大数据处理经典的处理框架即MapReduce , 分为Map和Reduce两个阶段 , 其中一个Map过程是将每个服务器上启动Map进程 , 计算后输出一个集合 。 reduce过程 , MapReduce在每个服务器上启动多个reduce进程 , 然后将所有的map输出的集合进行shuffle操作 , 什么是shuffle操作呢 , 即是将相同的ekey发送到同一个reduce进程 , 在reduce中完成数据关联的操作 。 下面以WordCount统计所有数据中相同的词频数据为例 , 详细看看Map和Reduce的过程 。 CSDN|42 张图带你揭秘后端技术都要学啥?
本文插图
wordcoun计算过程在这个例子中 , 通过对value中的1组成的列表 , reduce对这些1进行求和操作从而得到每个单词的词频 。 代码实现如下:public class WordCount { // Mapper四个参数:第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型 。 map这里的输出是指输出到reduce public static class doMapper extends Mapper<Object, Text, Text, IntWritable> { public static final IntWritable one = new IntWritable(1);//这里的IntWritable相当于Int类型 public static Text word = new Text;//Text相当于String类型// map参数<keyIn key,valueIn value,Context context> , 将处理后的数据写入context并传给reduce protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {//StringTokenizer是Java工具包中的一个类 , 用于将字符串进行拆分StringTokenizer tokenizer = new StringTokenizer(value.toString, " ");//返回当前位置到下一个分隔符之间的字符串word.set(tokenizer.nextToken);//将word存到容器中 , 记一个数 context.write(word, one); } }//参数同Map一样 , 依次表示是输入键类型 , 输入值类型 , 输出键类型 , 输出值类型 。 这里的输入是来源于map,所以类型要与map的输出类型对应。public static class doReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable;@Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws{ int sum = 0;//for循环遍历 , 将得到的values值累加 for (IntWritable value : values) { sum += value.get; } result.set(sum); context.write(key, result);//将结果保存到context中 , 最终输出形式为"key" + "result" } } public static void main(String args) throws IOException, ClassNotFoundException, InterruptedException { System.out.println("start"); Job job = Job.getInstance; job.setJobName("wordCount");Path in = new Path("hdfs://***:9000/user/hadoop/input/buyer_favorite1.txt");//设置这个作业输入数据的路径(***部分为自己liunx系统的localhost或者ip地址) Path out = new Path("hdfs://***:9000/user/hadoop/output/wordCount"); //设置这个作业输出结果的路径FileInputFormat.addInputPath(job, in); FileOutputFormat.setOutputPath(job, out);job.setJarByClass(WordCount.class);// 设置运行/处理该作业的类job.setMapperClass(doMapper.class);//设置实现了Map步的类 job.setReducerClass(doReducer.class);//设置实现了Reduce步的类job.setOutputKeyClass(Text.class);//设置输出结果key的类型 job.setOutputValueClass(IntWritable.class);//设置输出结果value的类型////执行作业 System.exit(job.waitForCompletion(true) ? 0 : 1);"end"); }}那么这个map和reduce进程是怎么在分布式的集群中启动的呢?


推荐阅读