首页 文章 精选 留言 我的

精选列表

搜索[业务线],共10007篇文章
优秀的个人博客,低调大师

将大数据学习门槛降到了地平线

Hadoop介绍 Hadoop-大数据开源世界的亚当夏娃。 核心是HDFS数据存储系统,和MapReduce分布式计算框架。 HDFS 原理是把大块数据切碎, 每个碎块复制三份,分开放在三个廉价机上,一直保持有三块可用的数据互为备份。使用的时候只从其中一个备份读出来,这个碎块数据就有了。 存数据的叫datenode(格子间),管理datenode的叫namenode(执伞人)。 MapReduce 原理是大任务先分堆处理-Map,再汇总处理结果-Reduce。分和汇是多台服务器并行进行,才能体现集群的威力。难度在于如何把任务拆解成符合MapReduce模型的分和汇,以及中间过程的输入输出<k,v> 都是什么。 单机版Hadoop介绍 对于学习hadoop原理和hadoop开发的人来说,搭建一套hadoop系统是必须的。但 配置该系统是非常头疼的,很多人配置过程就放弃了。 没有服务器供你使用 这里介绍一种免配置的单机版hadoop安装使用方法,可以简单快速的跑一跑hadoop例子辅助学习、开发和测试。 要求笔记本上装了Linux虚拟机,虚拟机上装了docker。 安装 使用docker下载sequenceiq/hadoop-docker:2.7.0镜像并运行。 [root@bogon ~]# docker pull sequenceiq/hadoop-docker:2.7.0 2.7.0: Pulling from sequenceiq/hadoop-docker860d0823bcab: Pulling fs layer e592c61b2522: Pulling fs layer 下载成功输出 Digest: sha256:a40761746eca036fee6aafdf9fdbd6878ac3dd9a7cd83c0f3f5d8a0e6350c76a Status: Downloaded newer image for sequenceiq/hadoop-docker:2.7.0 启动 [root@bogon ~]# docker run -it sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh -bash --privileged=true Starting sshd: [ OK ] Starting namenodes on [b7a42f79339c] b7a42f79339c: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-b7a42f79339c.out localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-b7a42f79339c.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-b7a42f79339c.out starting yarn daemons starting resourcemanager, logging to /usr/local/hadoop/logs/yarn--resourcemanager-b7a42f79339c.out localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-b7a42f79339c.out 启动成功后命令行shell会自动进入Hadoop的容器环境,不需要执行docker exec。在容器环境进入/usr/local/hadoop/sbin,执行./start-all.sh和./mr-jobhistory-daemon.sh start historyserver,如下 bash-4.1# cd /usr/local/hadoop/sbin bash-4.1# ./start-all.sh This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh Starting namenodes on [b7a42f79339c] b7a42f79339c: namenode running as process 128. Stop it first. localhost: datanode running as process 219. Stop it first. Starting secondary namenodes [0.0.0.0] 0.0.0.0: secondarynamenode running as process 402. Stop it first. starting yarn daemons resourcemanager running as process 547. Stop it first. localhost: nodemanager running as process 641. Stop it first. bash-4.1# ./mr-jobhistory-daemon.sh start historyserver chown: missing operand after `/usr/local/hadoop/logs' Try `chown --help' for more information. starting historyserver, logging to /usr/local/hadoop/logs/mapred--historyserver-b7a42f79339c.out Hadoop启动完成,如此简单。 要问分布式部署有多麻烦,数数光配置文件就有多少个吧!我亲眼见过一个hadoop老鸟,因为新换的服务器hostname主机名带横线“-”,配了一上午,环境硬是没起来。 运行自带的例子 回到Hadoop主目录,运行示例程序 bash-4.1# cd /usr/local/hadoop bash-4.1# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar grep input output 'dfs[a-z.]+' 20/07/05 22:34:41 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 20/07/05 22:34:43 INFO input.FileInputFormat: Total input paths to process : 31 20/07/05 22:34:43 INFO mapreduce.JobSubmitter: number of splits:31 20/07/05 22:34:44 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1594002714328_0001 20/07/05 22:34:44 INFO impl.YarnClientImpl: Submitted application application_1594002714328_0001 20/07/05 22:34:45 INFO mapreduce.Job: The url to track the job: http://b7a42f79339c:8088/proxy/application_1594002714328_0001/ 20/07/05 22:34:45 INFO mapreduce.Job: Running job: job_1594002714328_0001 20/07/05 22:35:04 INFO mapreduce.Job: Job job_1594002714328_0001 running in uber mode : false 20/07/05 22:35:04 INFO mapreduce.Job: map 0% reduce 0% 20/07/05 22:37:59 INFO mapreduce.Job: map 11% reduce 0% 20/07/05 22:38:05 INFO mapreduce.Job: map 12% reduce 0% mapreduce计算完成,有如下输出 20/07/05 22:55:26 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=291 FILE: Number of bytes written=230541 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=569 HDFS: Number of bytes written=197 HDFS: Number of read operations=7 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=1 Launched reduce tasks=1 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=5929 Total time spent by all reduces in occupied slots (ms)=8545 Total time spent by all map tasks (ms)=5929 Total time spent by all reduce tasks (ms)=8545 Total vcore-seconds taken by all map tasks=5929 Total vcore-seconds taken by all reduce tasks=8545 Total megabyte-seconds taken by all map tasks=6071296 Total megabyte-seconds taken by all reduce tasks=8750080 Map-Reduce Framework Map input records=11 Map output records=11 Map output bytes=263 Map output materialized bytes=291 Input split bytes=132 Combine input records=0 Combine output records=0 Reduce input groups=5 Reduce shuffle bytes=291 Reduce input records=11 Reduce output records=11 Spilled Records=22 Shuffled Maps =1 Failed Shuffles=0 Merged Map outputs=1 GC time elapsed (ms)=159 CPU time spent (ms)=1280 Physical memory (bytes) snapshot=303452160 Virtual memory (bytes) snapshot=1291390976 Total committed heap usage (bytes)=136450048 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=437 File Output Format Counters Bytes Written=197 hdfs命令查看输出结果 bash-4.1# bin/hdfs dfs -cat output/* 6 dfs.audit.logger 4 dfs.class 3 dfs.server.namenode. 2 dfs.period 2 dfs.audit.log.maxfilesize 2 dfs.audit.log.maxbackupindex 1 dfsmetrics.log 1 dfsadmin 1 dfs.servers 1 dfs.replication 1 dfs.file 例子讲解 grep是一个在输入中计算正则表达式匹配的mapreduce程序,筛选出符合正则的字符串以及出现次数。 shell的grep结果会显示完整的一行,这个命令只显示行中匹配的那个字符串 grep input output 'dfs[a-z.]+' 正则表达式dfs[a-z.]+,表示字符串要以dfs开头,后面是小写字母或者换行符\n之外的任意单个字符都可以,数量一个或者多个。 输入是input里的所有文件, bash-4.1# ls -lrt total 48 -rw-r--r--. 1 root root 690 May 16 2015 yarn-site.xml -rw-r--r--. 1 root root 5511 May 16 2015 kms-site.xml -rw-r--r--. 1 root root 3518 May 16 2015 kms-acls.xml -rw-r--r--. 1 root root 620 May 16 2015 httpfs-site.xml -rw-r--r--. 1 root root 775 May 16 2015 hdfs-site.xml -rw-r--r--. 1 root root 9683 May 16 2015 hadoop-policy.xml -rw-r--r--. 1 root root 774 May 16 2015 core-site.xml -rw-r--r--. 1 root root 4436 May 16 2015 capacity-scheduler.xml 结果输出到output。 计算流程如下 稍有不同的是这里有两次reduce,第二次reduce就是把结果按照出现次数排个序。map和reduce流程开发者自己随意组合,只要各流程的输入输出能衔接上就行。 管理系统介绍 Hadoop提供了web界面的管理系统, 端口号 用途 50070 Hadoop Namenode UI端口 50075 Hadoop Datanode UI端口 50090 Hadoop SecondaryNamenode 端口 50030 JobTracker监控端口 50060 TaskTrackers端口 8088 Yarn任务监控端口 60010 Hbase HMaster监控UI端口 60030 Hbase HRegionServer端口 8080 Spark监控UI端口 4040 Spark任务UI端口 加命令参数 docker run命令要加入参数,才能访问UI管理页面 docker run -it -p 50070:50070 -p 8088:8088 -p 50075:50075 sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh -bash --privileged=true 执行这条命令后在宿主机浏览器就可以查看系统了,当然如果Linux有浏览器也可以查看。我的Linux没有图形界面,所以在宿主机查看。 50070 Hadoop Namenode UI端口 50075 Hadoop Datanode UI端口 8088 Yarn任务监控端口 已完成和正在运行的mapreduce任务都可以在8088里查看,上图有gerp和wordcount两个任务。 一些问题 一、./sbin/mr-jobhistory-daemon.sh start historyserver必须执行,否则运行任务过程中会报 20/06/29 21:18:49 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:10020. Already tried 9 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS) java.io.IOException: java.net.ConnectException: Call From 87a4217b9f8a/172.17.0.1 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused 二、./start-all.sh必须执行否则报形如Unknown Job job_1592960164748_0001错误 三、docker run命令后面必须加--privileged=true,否则运行任务过程中会报java.io.IOException: Job status not available 四、注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。或者换成output01试试? 总结 本文方法可以低成本的完成Hadoop的安装配置,对于学习理解和开发测试都有帮助的。如果开发自己的Hadoop程序,需要将程序打jar包上传到share/hadoop/mapreduce/目录,执行 bin/hadoop jar share/hadoop/mapreduce/yourtest.jar 来运行程序观察效果。

优秀的个人博客,低调大师

前端的水平线,错误处理和调试

本章内容 理解浏览器报告的错误 处理错误 调试JavaScript代码 错误处理 错误处理在程序设计中的重要性是一定的。任何有影响力的Web应用程序都需要一套完善的错误处理机制。 try-catch语句 try { // 可能会导致错误的代码 } catch (e) { // 在错误发生时怎么处理 } 错误类型 执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。 ECMA-262定义了下列7种错误类型: Error EvalError RangeError SyntaxError ReferenceError TypeError URIError RangeError类型的错误在数值超出相应范围时触发: try { let items1 = new Array(-20); var items2 = new Array(Number.MAX_VALUE); } catch (e) { console.dir(e) } 在找不到对象的情况下,会发生ReferenceError(这种情况下,会直接导致人所共知的“object expected”浏览器错误)。通常,在访问不存在的变量时,就会发生这种错误: try { let obj = x; } catch (e) { console.dir(e) } SyntaxError类型, 当我们把语法错误的JavaScript字符串传入eval()函数时,就会导致此类错误。 eval('a++ b') TypeError类型在JavaScript中会经常用到,在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致这种错误。错误的原因虽然多种多样。**最常发生类型错误的情况,就是传递给函数的参数事先未经检查,结果传入类型与预期类型不相符。 Function.prototype.toString.call('name') // 抛出typeError 在使用encodeURI()或decodeURI(),而URI格式不正确时,就会导致URIError错误。这种错误很少见,因为前面说的这两个函数的容错性非常高。 利用不同错误类型,可以获悉更多有关异常的信息,从而有助于对错误作出恰当的处理。 try { // ...... } catch (e) { if (e instanceof TypeError) { // 处理类型错误 } else if (e instanceof ReferenceError) { // 处理引用错误 } else { // 处理其他类型的错误 } } 在跨浏览器编程中,检查错误类型是确定处理方式的最简便途径;包含在message属性中的错误消息会因浏览器而异。 合理使用try-catch 使用try-catch最适合处理那些我们无法控制的错误。假设你在使用一个大型JavaScript库中的函数,该函数可能会有意无意地抛出一些错误。由于我们不能修改这个库的源代码,所以大可将对该函数的调用放在try-catch语句当中。 抛出错误 与try-catch语句相配的还有一个throw操作符,用于随时抛出自定义错误。 throw new Error('Something bad happend') 上面这行代码抛出一个通用错误,带有一条自定义错误消息。也可以像下面使用其他错误类型,也可以模拟出类似的浏览器错误。 throw new SyntaxError('I dont like your syntax'); throw new TypeError('What type of variable do you take me for?'); throw new RangeError('Sorry, you just dont have the range') throw new EvalError('That doesnt evaluate.') throw new URIError('Uri, is that you?'); throw new ReferenceError('You didnt cite your references properly'); 错误事件 window.onerror = function (message, url, line) { // 处理错误 } 处理错误的策略 略 常见的错误类型 错误处理的核心,是首先要知道代码里会发生什么错误。由于JavaScript是松散类型的,而且也不验证函数的参数,因此错误只会在代码运行期间出现。一般需要关注三种错误: 类型转换错误 数据类型错误 通信错误 类型转换错误 全等操作符知道要比较的是两种不同的数据类型,因而直接返回false。 数据类型错误 Javascript是松散类型的,也就是说,在使用变量和函数参数之前,不会对它们进行比较以确保它们的数据类型正确。 通信错误 Javascript与服务器之间的任何一次通信,都有可能会产生错误。 第一种通信错误与格式不正确的URL或发送的数据有关。最常见的问题是在将数据发送给服务器之前,没有使用encodeURIComponent()对数据进行编码。 function addQueryString(url, name, value) { if (url.indexOf('?') === -1) { url += '?'; } else { url += '&'; } url += `&${encodeURIComponent(name)} = ${encodeURIComponent(value)}`; return url; } 使用这个函数而不是手工构建URL,可以确保编码正确并避免相关错误。 区分致命错误和非致命错误 任何错误处理策略中最重要的一部分,就是确定错误是否致命。对于非致命错误,可以根据下列一或多个条件来确定: 不影响用户的主要任务 只影响页面的一部分 可以恢复 重复相同操作可以消除错误 把错误记录到服务器 开发Web应用程序中的一种常见的做法,就是集中保存错误日志,以便查找重要错误的原因。 要建立这样一种JavaScript错误记录系统,首先需要在服务器上创建一个页面,用于处理错误数据。这个页面的作用无非就是从查询字符中取得数据,然后再将数据写入错误日志中。这个页面可能会使用如下所示的函数: function logError (lev, msg) { let img = new Image(); img.src = `log.php?e` } 这个logError()函数接收两个参数:表示严重程度的数值或字符串及错误消息。其中使用了Image对象来发送请求,这样做非常灵活,主要表现如下几方面: 所有浏览器都支持Image对象,包括那些不支持XMLHttpRequest对象。 可以避免跨域限制。 在记录错误的过程中出问题的概率比较低。大多数Ajax通信都是由JavaScript库提供的包装函数来处理的,如果库代码本身有问题,而你还在依赖该库记录错误,可想而知,错误消息是不可能得到记录的。 小结 错误处理至关重要。不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验。 下面是几种避免浏览器响应JavaScript错误的方法。 在可能发生错误的地方使用try-catch语句,这样你还有机会以适当的方式对错误给出响应。 使用window.onerror事件处理程序,这种方式可以接受try-catch不能处理的所有错误。 另外,对任何Web应用程序都应该分析可能发生的错误。JavaScript中发生错误的主要原因如下。 类型转换 未充分检测数据类型 发送给服务器或从服务器接收到的数据有错误 原文发布时间为:2018年06月06日 原文作者:ZhangCheng 本文来源: 掘金 如需转载请联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册