首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

性能诊断利器 JProfiler 快速入门和最佳实践

背景 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。本文将介绍 Java 性能诊断过程中的常用工具,并重点介绍其中的优秀代表 JProfiler 的基本原理和最佳实践(本文所作的调研基于jprofiler10.1.4)。 Java 性能诊断工具简介 在 Java 的世界里,有许多诊断工具可供选择,既包括像 jmap、jstat 这样的简单命令行工具,又包括 JVisualvm、JProfiler 等图形化综合诊断工具,同时还有 SkyW

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

开源APM监控Pinpoint的快速部署和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00 Pinpoint是用于大规模分布式系统的APM工具。它是在Dapper(一个由Google构建的分布式系统跟踪基础架构)之后构建的,为开发人员提供有关复杂分布式系统行为的更多信息。 开源地址:https://github.com/naver/pinpoint Pinpoint作为一款非常优秀的开源APM监控平台,和其他开源系统一样,最繁琐的应该是部署,但是如果你能通过Docker的方式进行部署,我们就可以感受到一键部署的便捷: Docker镜像地址:https://hub.docker.com/u/pinpointdocker Docker-compose地址:https://github.com/naver/pinpoint-docker 一、部署前准备 在Centos7系统上安装Docker和docker-compose yum update -y yum install docker epel-release python-pip -y pip install --upgrade pip pip install docker-compose 对于docker-compose也可以安装指定版本(比如最新版的,因为不同版本支持不同格式的docker-compose文件) yum update -y nss curl libcurl sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 为了加速docker镜像pull速度,可以修改daemon.json # cat /etc/docker/daemon.json {"registry-mirrors": ["http://579fe187.m.daocloud.io","https://pee6w651.mirror.aliyuncs.com"]} 启动docker systemctl enable docker systemctl start docker 二、安装Pinpoint 按照官网的docker部署方式:https://github.com/naver/pinpoint-docker(部署前把宿主机防火墙都关了) git clone https://github.com/naver/pinpoint-docker.git cd Pinpoint-Docker docker-compose pull && docker-compose up -d 直接这样部署可能会有问题,比如我们只在一台宿主机上部署,我们可以用git命令下载,或是用curl命令先下载zip再解压: sudo curl -L https://github.com/naver/pinpoint-docker/archive/master.zip -o /opt/pinpoint-docker.zip cd /opt upzip pinpoint-docker.zip -d . cd /opt/pinpoint-docker-master 编辑docker-compose.yml,将多个节点的zookeeper改成一个节点(注释掉不需要的): #zookeepers zoo1: image: zookeeper:3.4 restart: always #hostname: zoo1 hostname: 172.17.2.84 environment: ZOO_MY_ID: 1 #ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 ZOO_SERVERS: server.1=0.0.0.0:2888:3888 networks: - pinpoint #zoo2: # image: zookeeper:3.4 # restart: always # hostname: zoo2 # environment: # ZOO_MY_ID: 2 # ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888 # networks: # - pinpoint #zoo3: # image: zookeeper:3.4 # restart: always # hostname: zoo3 # environment: # ZOO_MY_ID: 3 # ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888 # networks: # - pinpoint 如还有问题,请修改相对路径为绝对路径 ... volumes: - /home/pinpoint/hbase - /home/pinpoint/zookeeper ... 基本我在根目录下,运行docker-compose up -d 就能完成docker集群的部署(在后台进行),如果是想看清部署的整个过程,直接用命令: docker-compose up 启动完后容器: ​ 用Rancher查看能比较直观: ​ 安装完后,就可以连接http://172.17.2.84:8079查看,除了一个quickapp应用,什么也没有: ​ 三、部署监控代理 为了监控我们的应用(tomcat、Java、weblogic等),就需要部署监控代理,这个非常简单,首先是去官网下载同版本的agent包:https://github.com/naver/pinpoint/releases/download/1.8.0/pinpoint-agent-1.8.0.tar.gz 将agent包解压到应用(以tomcat为例)目录下: tar zxvf pinpoint-agent-1.8.0.tar.gz -C pinpoint-agent 修改配置文件pinpoint.config,将collector的ip配置为监控收集服务pinpoint-collector的IP: ​ 然后修改tomcat的启动文件catalina.sh,添加javaagent配置参数(这一点和其他商用APM监控工具一样): JAVA_OPTS="$JAVA_OPTS -javaagent:/usr/apache-tomcat-7.0.54/pinpoint-agent/pinpoint-bootstrap-1.8.0.jar" JAVA_OPTS="$JAVA_OPTS -Dpinpoint.agentId=APM-104" JAVA_OPTS="$JAVA_OPTS -Dpinpoint.applicationName=tomcat7-test" 除了javaagent参数,还有agentId参数(应用的唯一标识,不允许和其他应用重名),和applicationName(应用名)。 配完后,就可以重启tomcat了,那么在界面上就能看到新追加的应用了: ​ 对于微服务的jar包也能进行监控: java -javaagent:/mypath/pinpoint-agent/pinpoint-bootstrap-1.8.0.jar -Dpinpoint.agentId=APM-104 -Dpinpoint.applicationName=tomcat7-test -jar myapp.jar 四、使用手册 1. 查看调用关系 1.1 访问地址 http://yoururl 1.2 选择应用 ​ 默认两层展示 ​ 调整层级深度: 示例为前端调用4层追溯,后端调用4层追溯(4层为最深层级) ​ 结果展示: ​ 在图片内按鼠标滚轮调整图片大小。 连线上数字为调用次数 ​ 选择更多时间范围(默认最新5分钟) ​ 2.查看调用链 鼠标按住右键,选中图中区域,松开右键,则展示选中时间段调用层级 ​ 展示结果: ​ 默认按耗时排序 选中某一调用,展示详细调用链及耗时 ​ 选中timelinetab可查看耗时情况: ​ 3. 查看错误信息 3.1 选择错误应用 机器应用抛出错误,机器应用会标红 ​ 3.2 查看详细信息 选中应用,去除成功多选按钮选中对勾,按住鼠标右键,选中红点范围,松开鼠标右键,即可查看详细错误信息: ​ 结果为: ​ 选中某次错误请求,可在详细列表内找到详细错误信息 4. 查看应用情况 选中某一应用 单击inspector ​ 选中某一机器id,时间段,可展示jvm详细信息 ​ 其中内容包含:Jvm内存使用情况,Jvm永久带使用占用空间,Cpu使用情况,每秒处理的消息数(S标识操作系统,U标识此应用),Jvm线程情况,单请求平均响应时间等。

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

使用docker快速搭建Permeate渗透测试系统实践

一、背景 笔者最近在做一场Web安全培训,其中需要搭建一套安全测试环境;在挑选渗透测试系统的时候发现permeate渗透测试系统比较满足需求,便选择了此系统;为了简化这个步骤,笔者将系统直接封装到了docker当中,同时编写了一套启动文档,希望到时候给学员和读者参考。 二、操作实践 数据库搭建 permeate搭建 安装配置 三、数据库搭建 permeate渗透测试系统使用的数据库是MySQL,因此笔者需要先安装mysql数据库服务,为了简化安装,便直接使用了docker方式进行,参考命令如下 docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=123 -d -i -p 3309:3306 mysql:5.6 启动之后,可以使用宿主机的MySQL管理软件连接测试,如下图所示 四、permeate搭建 在安装完MySQL服务之后,便可以安装permeate系统了,笔者已经将所需PHP和nginx环境封装好了,因此只需下载镜像运行即可 4.1 运行容器 在运行容器时候需要考虑两个问题,首先需要将web端口映射出来宿主机才可以访问,第二个是需要考虑此容器要能访问得到mysql服务,因此参考命令如下: docker run --name permeate_test --link mysqlserver:db -d -i -p 8888:80 registry.cn-hangzhou.aliyuncs.com/daxia/websafe:init 4.2 启动服务 在启动容器之后,通过浏览器访问http://localhost:8888/并不能打开网页,原因是因为nginx服务和PHP服务都还未启动,启动的命令参考如下所示: docker exec permeate_test zsh -c "nginx && /usr/sbin/php-fpm7.2 -R" 此时再通过浏览器访问http://localhost:8888/,便可以打开安装协议页面,如下图所示 五、安装配置 安装过程比较简单,但在填写数据库地址的时候需要注意,我们已经将mysqlserver链接到了permeate容器当中,此时数据库地址直接填写db即可,数据库密码笔者在启动MySQL容器时设置的为123,这里也填写123,参考如下图所示 再次点击下一步的时候,能看到页面当中返回数据表安装成功的提示,如下图所示 点击进入首页按钮之后,便可以来到首页,首页如下图所示 六、图书推荐 如果对笔者的文章较为感兴趣,可以关注笔者新书《PHP Web安全开发实战》,现已在各大平台上架销售,封面如下图所示 作者:汤青松 日期:2018-11-26 微信:songboy8888

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

使用Docker快速部署ELK分析Nginx日志实践

一、背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前听说有ELK这种神器,搜索了一下,发现利用docker搭建似乎并不麻烦,于是进行了一番尝试,结果还比较顺利,将此过程完整记录下来,希望留给有需要的读者进行参考。 笔者这次实践的过程当中参考了较多的文档与笔记,参考的链接地址有:Docker ElK安装部署使用教程 、Docker Hub官网、Docker ELK使用文档 二、操作概要 服务安装与运行 数据导入与校验 绘图配置与展示 三、服务安装与运行 安装ELK有很多种方式,比如源码、rpm包,或docker;不过docker又分为了单个安装与ELK打包安装,笔者这里是通过docker打包安装,因为这样的方式相比来说最为简单,因为只需要下载镜像,然后运行起来就可以了 3.1 镜像下载 ELK镜像已经被docker官方收录,因此只需要简单的命令即可拉取到镜像;但考虑到ELK镜像比较大,在拉取过程当中存在比较慢的情况,因此笔者使用了阿里云的加速器来提速;笔者使用的是MAC版本的docker,参考配置方法如下: 3.1.1 镜像加速 右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签下的 Registry mirrors 列表中将 https://k0pf39f8.mirror.aliyuncs.com加到registry-mirrors的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器,如下截图 3.1.2 镜像获取 设置好加速地址之后,笔者就可以开始拉取ELK镜像,参考命令如下: docker pull sebp/elk 笔者当前镜像laster对应的版本为6.2.4,如果读者以后看到此文章,在搭建的时候遇到一些问题,可以在命令后面加上:6.2.4来指定该版本,减少意外产生; 下载镜像之后可以使用docker的命令来验证是否成功,参考命令如下: docker images 笔者执行后docker返回结果如下 REPOSITORY TAG IMAGE ID CREATED SIZE sebp/elk latest c916150705cc 2 weeks ago 1.49GB 在结果当中可以看出,ELK镜像已经下载下来,占用了将近1.5GB空间 3.2 容器运行 运行此容器的时候,需要将宿主机的端口转发到该容器,其中ES端口为9200,kibana端口为5601,logbate端口为5044;另外笔者建议将配置文件和数据存放在宿主机,便于后期维护,因此还需要将宿主机目录挂载到容器/data当中;最后构造的命令如下: docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -v /Users/song/dockerFile:/data -it -d --name elk sebp/elk 笔者在运行容器的参数当中加入了后台运行-d参数,这样笔者就不怕误操作突然把容器停止了,但放置于后台运行,ELK的服务器启动过程是不可见的,这个启动时间根据你机器的性能所决定,笔者电脑大约在10秒钟左右;如果觉得启动失败,也可以将该容器删除,然后重新创建一个容器,上述命令中的-d删除即可看到启动过程。 3.3 数据导入与校验 容器运行之后,笔者需要验证是否启动成功,可以通过浏览器访问kibana和ES的页面是否成功来判断。 3.3.1 检查Kibana 通过浏览器访问kibana,如果正常出现界面,则代表启动成功,URL地址如下: http://localhost:5601/ 当浏览器访问成功之后,参考如下图所示: 3.3.2 ES服务检查 验证kibana启动成功之后,接着继续验证ES服务是否启动成功,URL地址如下 http://localhost:9200/_search?pretty 访问之后,此时ES里面应该是没有数据的,出现的界面如下 四、配置与验证 在保证es和kibana服务启动完成之后,笔者还需要进行一些数据导入步骤 4.1 logstash配置 logstash配置主要有三个地方要处理,首先是输入源在什么位置,然后是对数据进行过滤或者格式化,最后是需要将数据输出到什么地方;笔者在下方的配置只做了其中两项,因为在nginx日志当中已经将日志格式化了,编辑配置文件命令参考如下: vim /Users/song/dockerFile/config/logstash.yml 配置文件内容参考如下 input { file { path => "/data/logs/access.log" codec => "json" } } output { elasticsearch { hosts => ["127.0.0.1:9200"] } stdout { codec => rubydebug } } 在配置文件当中,可以看到日志文件存放的位置在 "/data/logs/access.log"当中,输出的地址是127.0.0.1:9200,这是本机的ES服务 4.2 nginx日志格式 因为笔者对logstash的配置文件语法不太熟悉,在里面写过滤器和筛选项比较费时间,所以选择直接更改nginx中的日志格式,将nginx的日志文件设置为json格式,在更改nginx配置文件之前,需要获取nginx配置文件路径,参考如下命令 sudo nginx -t 返回结果 Password: nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful 在返回的结果当中已经可以看到配置文件所在的位置,使用vim编辑配置文件,参考命令 vim /usr/local/etc/nginx/nginx.conf 在http级别下增加自定义日志格式,和日志路径,参考配置如下: log_format json '{"@timestamp":"$time_iso8601", "@version":"1","host":"$server_addr", "client":"$remote_addr", "size":"$body_bytes_sent", "responsetime":"$request_time", "domain":"$host","url":"$uri","status":"$status"}'; access_log /data/logs/access.log json; 笔者配置截图如下所示 4.3 启动logstash 前面已经将日志格式与logstash配置好,现在笔者需要启动logstash开始收集日志,启动logstash之前需要先进入容器里面,进入容器参考命令如下: docker exec -it elk bash 进入容器之后,笔者需要启动logstash来收集数据,启动的时候需要带两个参数进去,第一个是logstash的数据暂存位置,第二个是使用的配置文件,因此构造的命令如下所示: /opt/logstash/bin/logstash --path.data /tmp/logstash/data -f /data/config/logstash.conf 4.4 添加数据 现在只要nginx产生日志,logstash就会实时将日志发送到ES服务当中,在发送数据时,终端窗口也会发生变化,如下图所示 五、 绘图配置与展示 当数据导入之后,笔者才可以使用kibana的图形化来查看数据了,所以首先确认一下ES中是否有数据,确认有数据后就可以进行绘图配置,配置完成之后就可以进行筛选日志等操作了。 5.1 ES数据检查 当数据添加到ES服务器当中后,笔者可以通过ES服务提供的URL来查看其中的数据,URL地址如下所示: http://localhost:9200/_search?pretty 就会看到笔者刚刚输入的日志内容,如下图所示 当看到total数量变大,并在下面的数据项中看到了nginx日志信息时,则代表笔者导入数据成功了。 5.2 kibana索引配置 通过浏览器访问kibana,URL地址如下 http://127.0.0.1:5601/app/kibana#/management/kibana/index?_g=() 点击左侧导航栏的Discover链接,便可进入创建索引模式界面,如下图所示 点击页面右下方的next按钮,会跳转到下一个页面,在此页面还需要选择一个时间维度,如下图所示 在此点击下一步,便创建kibana的索引完成,此时再次点击左侧导航栏的Discover链接,便可以看到刚才创建索引的一些视图,如下图所示 在图中有一个input输入框,笔者可以在里面填写筛选所需要的关键词;如果没有筛选出结果,也可检查左侧的时间筛选项是否设置正确,如笔者的时间筛选项设置的是Today,也就代表筛选当天的数据。 ELK的整体操作流程比较简单,首先是logstash收集各种日志并进行过滤,然后将过滤后的内容发送到ES服务中,最后用户通过Kibana的页面查看ES中的日志数据; 作者:汤青松 微信:songboy8888 日期:2018-08-25

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

grafana+prometheus快速搭建MySql监控系统实践

版权声明:作者:汤青松 https://blog.csdn.net/u013431141/article/details/81633229 一、背景 对于LNMP环境下的开发者来说,mysql是非常重要的一环,同时mysql的性能监控也是开发者所需要关注的一环;如果大家使用阿里云的RDS会感觉到其监控功能非常好用,但如果开发者使用的是自建数据库,该怎么去搭建则需则需要去考虑一番了。 在prometheus和grafana未普及之前,要实现mysql的搭建确实要费一番工夫的,不过现在则很简单就可以实现mysql的监控了。 笔者之前写过一篇grafana+prometheus的基础篇,因此本文中有些较为基础的操作就省略了,读者如果有不清晰的地方,建议去看一下基础篇,参考链接:grafana+ prometheus+php 监控系统实践 二、操作概要 安装Mysqld-Exporter 增加prometheus任务 导入mysql仪表盘 功能验证与展示 三、安装Mysqld-Exporter 要实现监控mysql的状态,就需要获取mysql的一些数值,然后把这些数值传递给prometheus,这个过程使用mysqld-exporter就可以轻易实现了,安装之后,把所需的参数传递过去就可以使用,这里使用docker安装最为方便,因此笔者在下面的安装方法便是采用此种方法安装。 3.1 下载镜像 使用docker方式下载极为方便,只需要执行如下命令即可,当然前提是需要安装了docker。 docker pull prom/mysqld-exporter 3.2 创建容器并启动 下载镜像完成之后,笔者需要按照指定的格式把数据库的一些账号与密码以及地址名称等信息传入进入,参考格式如下方命令: docker run -d -p 9104:9104 -e DATA_SOURCE_NAME="root:password@(127.0.0.1:3306)/databaseName" prom/mysqld-exporter 3.3 验证 启动之后,笔者需要验证是否启动成功,可以通过浏览器访问如下地址 http://127.0.0.1:9104/ 当在浏览器当中看到如下界面,则代表以及启动成功,如下图: 不过需要注意的是,看到此界面并不代表你的数据库账号与密码以及地址就正确了。 四、增加prometheus任务 经过前面一个步骤,笔者已经有了数值来源,现在需要做的就是通过prometheus将其收集起来,收集的方法也比较简单,修改配置文件,重启prometheus即可,具体操作方法如下: 4.1 编辑prometheus的配置文件 vim /Users/song/config/prometheus/prometheus.yml 增加一个收集任务 --- global: scrape_interval: 5s scrape_timeout: 3s scrape_configs: - job_name: 'media' scrape_interval: 3s metrics_path: "/api/v1/rrd/toolSpool" static_configs: - targets: ['gslb.offcncloud.com:8080'] - job_name: 'mysql' scrape_interval: 5s static_configs: - targets: ['127.0.0.1:9104'] labels: instance: 127.0.0.1 在配置文件当中,能看到prometheus会每5秒收集一次数据,需要给prometheus传入主机地址。 4.2 启动prometheus 修改并保存配置文件之后,笔者需要启动prometheus,在mac系统中启动命令如下: prometheus --config.file=/Users/song/config/prometheus/prometheus.yml 4.3 验证收集是否成功 启动完成之后,需要验证prometheus是否启动成功,可以通过浏览器打开如下URL: http://127.0.0.1:9090/graph 如果在URL中看到mysql的状态为绿色标志,则代表笔者增加的任务已经成功。 五、导入mysql仪表盘 到这一步笔者已经把mysql的性能数值导入到prometheus当中,现在所需要做的事情便是在grafana当中展示仪表盘;这个仪表盘笔者可以自己去手动创建,也可以导入一些开源的仪表盘,笔者觉得第三方的仪表盘省事也好看,所以这里将采用导入开源的仪表盘方式。 5.1 下载仪表盘文件 首先需要在GitHub下载这些仪表盘文件,下载命令如下: git clone https://github.com/percona/grafana-dashboards.git 下载完成之后,在其项目根目录的dashboards文件夹下,会有一批grafana所导出的仪表盘文件,如下图 找到MySQL_Overview.json文件,并打开此文件,将其里面的内容复制下来, 链接地址:MySQL_Overview.json,笔者将其上传到了自己的服务器,读者可以直接打开如下URL地址: http://tuchuang.qsjianzhan.com/mysql/MySQL_Overview.json 5.2 启动grafana 现在笔者需要启动grafana,笔者使用mac的brew安装,所以启动命令如下: brew services start grafana 5.3 导入仪表盘 grafana本身提供导入仪表盘功能,通过浏览器访问如下网址: http://127.0.0.1:3000/ 在grafana左侧有一个添加仪表盘的图表,可以点击点击导入仪表盘,操作方法如下图: 前面笔者已经复制了仪表盘的文件,现在需要将其粘贴进来,并点击load 六. 功能验证与展示 导入仪表盘之后,可以打开grafana的首页,在首页当中会展示仪表盘列表,找到刚才导入的仪表盘,如下图 找到对应的仪表盘便可查看mysql的详细数值,如下图所示: 作者:汤青松 微信:songboy8888

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

快速上手物联网解决方案(5)—— DataV

DataV 是阿里云推出的一款数据可视化工具,可以帮助非专业的工程师通过图形化的界面轻松搭建具有专业水准的可视化应用,让更多的人看到数据可视化的魅力。 本实例我们就利用 DataV 读取前文『表格存储』中的物联网设备数据,制作一份折线图。 首先,开通 DataV 服务,请注意本服务需付费使用,也是本系列教程唯一预付费才可使用的产品。(目前仅企业版支持『表格存储』数据源) 开通服务后,我们可以看到非常多的模板,本实例的场景比较简单,因此选择新增可视化 —— 空白模板,从上方组件中拖入『双轴折线图』组件: 点击刚添加的『双轴折线图』 —— 数据,我们先接入数据源,选择 TableStore,新增配置。 配置项这里做个说明:AK 就是 Accesskey,鼠标移动到阿里云任意产品的控制台界面移至右上角即会出现,点击进入即可获取,千万注意保密! 外网

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

TOML-to-Go : 帮你快速生成 Go 结构体

TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。 通过 toml-to-go 提供的 Web UI,可以方便的将 TOML 转换成 Golang 结构体。 在左侧粘贴 TOML 文件内容即可得到对应的 Struct,接下来可以将得到的结构体使用到你的 Golang 项目中。 项目地址 xuri.me/toml-to-go 代码开源 github.com/xuri/toml-to-go 界面截图

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

快速搭建一个Fabric 1.0的环境

之前笔者写了一篇Fabric1.0 Beta的部署和Fabric 1.0的多机部署。但是很多人在部署Fabric的时候还是很容易出问题,所以我就再把Fabric 1.0的单机环境搭建讲一下。其实很多内容和前面博客相同。下面开始我们的环境搭建工作: 1. 使用VirtualBox并在其中安装好Ubuntu 这一步其实没啥好说的,下载好最新版的VirtualBox,下载Ubuntu Server,我用的是Ubuntu16.04.2 X64 Server。在安装完Ubuntu后,需要保证apt source是国内的,不然如果是国外的话会很慢很慢的。具体做法是 sudo vi /etc/apt/sources.list 打开这个apt源列表,如果其中看到是http://us.xxxxxx之类的,那么就是外国的,如果看到是http://cn.xxxxx之类的,那么就不用换的。我的是美国的源,所以需要做一下批量的替换。在命令模式下,输入: :%s/us./cn./g 就可以把所有的us.改为cn.了。然后输入:wq即可保存退出。 sudo apt-get update 更新一下源。 然后安装ssh,这样接下来就可以用putty或者SecureCRT之类的客户端远程连接Ubuntu了。 sudo apt-get install ssh 2. Go的安装 Ubuntu的apt-get虽然提供了Go的安装,但是版本比较旧,最好的方法还是参考官方网站https://golang.org/dl/,下载最新版的Go。具体涉及到的命令包括: wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.9.linux-amd64.tar.gz 【注意:不要使用apt方式安装go,apt的go版本太低了!】 接下来编辑当前用户的环境变量: vi ~/.profile 添加以下内容: export PATH=$PATH:/usr/local/go/bin export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$HOME/go/bin 编辑保存并退出vi后,记得把这些环境载入: source ~/.profile 我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建go文件夹 cd ~ mkdir go 3. Docker安装 我们可以使用阿里提供的镜像,安装也非常方便。通过以下命令来安装Docker curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - 安装完成后需要修改当前用户(我使用的用户叫fabric)权限: sudo usermod -aG docker fabric 注销并重新登录,然后添加阿里云的Docker Hub镜像: sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 不同的版本添加方法是不一样的,官方的文档如下: https://cr.console.aliyun.com/#/accelerator 当然觉得阿里云镜像不好用,喜欢用DaoClound的也可以用DaoClound的镜像。DaoCloud的镜像设置文档为:https://www.daocloud.io/mirror#accelerator-doc 4. Docker-Compose的安装 Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。在安装Docker-Compose之前,需要安装Python-pip,运行脚本: sudo apt-get install python-pip 然后是安装docker-compose,我们从官方网站(https://github.com/docker/compose/releases)下载也可以从国内的进行DaoClound下载,为了速度快接下来从DaoClound安装Docker-compose,运行脚本: curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose sudo mv ~/docker-compose /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 5. Fabric源码下载 我们可以使用Git命令下载源码,首先需要建立对应的目录,然后进入该目录,Git下载源码: mkdir -p ~/go/src/github.com/hyperledger cd ~/go/src/github.com/hyperledger git clone https://github.com/hyperledger/fabric.git 由于Fabric一直在更新,所有我们并不需要最新最新的源码,需要切换到v1.0.0版本的源码即可: cd ~/go/src/github.com/hyperledger/fabric git checkout v1.0.0 6. Fabric Docker镜像的下载 这个其实很简单,因为我们已经设置了Docker Hub镜像地址,所以下载也会很快。官方文件也提供了批量下载的脚本。我们直接运行: cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/ source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0 这样就可以下载所有需要的Fabric Docker镜像了。由于我们设置了国内的镜像,所以下载应该是比较快的。 下载完毕后,我们运行以下命令检查下载的镜像列表: docker images 得到的结果如下: 7.启动Fabric网络并完成ChainCode的测试 我们仍然停留在e2e_cli文件夹,这里提供了启动、关闭Fabric网络的自动化脚本。我们要启动Fabric网络,并自动运行Example02 ChainCode的测试,执行一个命令: ./network_setup.sh up 这个做了以下操作: 7.1编译生成Fabric公私钥、证书的程序,程序在目录:fabric/release/linux-amd64/bin 7.2基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。 7.3基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。 7.4基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。 7.5在CLI启动的时候,会运行scripts/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能。 最后运行完毕,我们可以看到这样的界面: 如果您看到这个界面,这说明我们整个Fabric网络已经通了。 8.手动测试一下Fabric网络 我们仍然是以现在安装好的Example02为例,在官方例子中,channel名字是mychannel,链码的名字是mycc。我们首先进入CLI,我们重新打开一个命令行窗口,输入: docker exec -it cli bash 运行以下命令可以查询a账户的余额: peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' 可以看到余额是90: 然后,我们试一试把a账户的余额再转20元给b账户,运行命令: peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}' 运行结果为: 现在转账完毕, 我们试一试再查询一下a账户的余额,没问题的话,应该是只剩下70了。我们看看实际情况: 果然,一切正常。最后我们要关闭Fabric网络,首先需要运行exit命令退出cli容器。关闭Fabric的命令与启动类似,命令为: cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli ./network_setup.sh down 现在我们整个Fabric的环境已经测试完毕,恭喜,一切正常,接下来我们就是去做自己的区块链的开发。希望我的文章对大家有所帮助。 本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/p/7437157.html,如需转载请自行联系原作者

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

C# 版 flvmerge:快速合并多个flv文件

网上的视频很多都是分片的flv文件,怎么把他们合为一体呢?GUI工具就不考虑了,不适合批量执行,不适合在后台运行。有没有命令行工具或库可以实现呢? ffmpeg提供了一个方法: (1)先把flv文件转换成mpeg; (2)将多个mpeg文件合并成1个独立的mpeg文件(二进制合并即可) (3)将独立的mpeg文件转换成独立的flv文件。 网上搜到的最多的也是这种解决办法。这种方法有两个缺点: (1)需要两遍转码,非常耗时; (2)转换后的独立的mpeg文件比原视频要短一点点。 木有办法了,只好另寻他路。有人说有一个flvmerge.exe程序可以将多个flv合并成一个,可惜的是俺搜了很久,都没找到这个程序,最后还是在一款免费软件里把这个“flvmerge.exe”文件给揪出来了,不幸的是,这个“flvmerge.exe”得不到正确的结果。 润之同学说过,自己动手,丰衣足食。上github上搜“flvmerge”,发现两个项目,“flvmerge”和“flvmerger”,都是C写的。前者不依赖于第三方库,后者依赖于第三方库,那么就从第一个开始吧。 看了看它的代码,知道了flv文件合并的原理: (1)flv文件由1个header和若干个tag组成; (2)header记录了视频的元数据; (3)tag是有时间戳的数据; (4)flv合并的原理就是把多个文件里的tag组装起来,调整各tag的时间戳,再在文件起始处按个头部。 下面是我参照flvmerge项目,用linqpad写的一个C#版本的flvmerge代码: 1 void Main() 2 { 3 String path1 = "D:\\Videos\\Subtitle\\OutputCache\\1.flv"; 4 String path2 = "D:\\Videos\\Subtitle\\OutputCache\\2.flv"; 5 String path3 = "D:\\Videos\\Subtitle\\OutputCache\\3.flv"; 6 String output = "D:\\Videos\\Subtitle\\OutputCache\\output.flv"; 7 8 using(FileStream fs1 = new FileStream(path1, FileMode.Open)) 9 using(FileStream fs2 = new FileStream(path2, FileMode.Open)) 10 using(FileStream fs3 = new FileStream(path3, FileMode.Open)) 11 using(FileStream fsMerge = new FileStream(output, FileMode.Create)) 12 { 13 Console.WriteLine(IsFLVFile(fs1)); 14 Console.WriteLine(IsFLVFile(fs2)); 15 Console.WriteLine(IsFLVFile(fs3)); 16 17 if(IsSuitableToMerge(GetFLVFileInfo(fs1),GetFLVFileInfo(fs2)) == false 18 || IsSuitableToMerge(GetFLVFileInfo(fs1),GetFLVFileInfo(fs3)) == false) 19 { 20 Console.WriteLine("Video files not suitable to merge"); 21 } 22 23 int time = Merge(fs1,fsMerge,true,0); 24 time = Merge(fs2,fsMerge,false,time); 25 time = Merge(fs3,fsMerge,false,time); 26 Console.WriteLine("Merge finished"); 27 } 28 } 29 30 const int FLV_HEADER_SIZE = 9; 31 const int FLV_TAG_HEADER_SIZE = 11; 32 const int MAX_DATA_SIZE = 16777220; 33 34 class FLVContext 35 { 36 public byte soundFormat; 37 public byte soundRate; 38 public byte soundSize; 39 public byte soundType; 40 public byte videoCodecID; 41 } 42 43 bool IsSuitableToMerge(FLVContext flvCtx1, FLVContext flvCtx2) 44 { 45 return (flvCtx1.soundFormat == flvCtx2.soundFormat) && 46 (flvCtx1.soundRate == flvCtx2.soundRate) && 47 (flvCtx1.soundSize == flvCtx2.soundSize) && 48 (flvCtx1.soundType == flvCtx2.soundType) && 49 (flvCtx1.videoCodecID == flvCtx2.videoCodecID); 50 } 51 52 bool IsFLVFile(FileStream fs) 53 { 54 int len; 55 byte[] buf = new byte[FLV_HEADER_SIZE]; 56 fs.Position = 0; 57 if( FLV_HEADER_SIZE != fs.Read(buf,0,buf.Length)) 58 return false; 59 60 if (buf[0] != 'F' || buf[1] != 'L' || buf[2] != 'V' || buf[3] != 0x01) 61 return false; 62 else 63 return true; 64 } 65 66 FLVContext GetFLVFileInfo(FileStream fs) 67 { 68 bool hasAudioParams, hasVideoParams; 69 int skipSize, readLen; 70 int dataSize; 71 byte tagType; 72 byte[] tmp = new byte[FLV_TAG_HEADER_SIZE+1]; 73 if (fs == null) return null; 74 75 FLVContext flvCtx = new FLVContext(); 76 fs.Position = 0; 77 skipSize = 9; 78 fs.Position += skipSize; 79 hasVideoParams = hasAudioParams = false; 80 skipSize = 4; 81 while (!hasVideoParams || !hasAudioParams) 82 { 83 fs.Position += skipSize; 84 85 if (FLV_TAG_HEADER_SIZE+1 != fs.Read(tmp,0,tmp.Length)) 86 return null; 87 88 tagType = (byte)(tmp[0] & 0x1f); 89 switch (tagType) 90 { 91 case 8 : 92 flvCtx.soundFormat = (byte)((tmp[FLV_TAG_HEADER_SIZE] & 0xf0) >> 4) ; 93 flvCtx.soundRate = (byte)((tmp[FLV_TAG_HEADER_SIZE] & 0x0c) >> 2) ; 94 flvCtx.soundSize = (byte)((tmp[FLV_TAG_HEADER_SIZE] & 0x02) >> 1) ; 95 flvCtx.soundType = (byte)((tmp[FLV_TAG_HEADER_SIZE] & 0x01) >> 0) ; 96 hasAudioParams = true; 97 break; 98 case 9 : 99 flvCtx.videoCodecID = (byte)((tmp[FLV_TAG_HEADER_SIZE] & 0x0f)); 100 hasVideoParams = true; 101 break; 102 default : 103 break; 104 } 105 106 dataSize = FromInt24StringBe(tmp[1],tmp[2],tmp[3]); 107 skipSize = dataSize - 1 + 4; 108 } 109 110 return flvCtx; 111 } 112 113 int FromInt24StringBe(byte b0, byte b1, byte b2) 114 { 115 return (int)((b0<<16) | (b1<<8) | (b2)); 116 } 117 118 int GetTimestamp(byte b0, byte b1, byte b2, byte b3) 119 { 120 return ((b3<<24) | (b0<<16) | (b1<<8) | (b2)); 121 } 122 123 void SetTimestamp(byte[] data, int idx, int newTimestamp) 124 { 125 data[idx + 3] = (byte)(newTimestamp>>24); 126 data[idx + 0] = (byte)(newTimestamp>>16); 127 data[idx + 1] = (byte)(newTimestamp>>8); 128 data[idx + 2] = (byte)(newTimestamp); 129 } 130 131 int Merge(FileStream fsInput, FileStream fsMerge, bool isFirstFile, int lastTimestamp = 0) 132 { 133 int readLen; 134 int curTimestamp = 0; 135 int newTimestamp = 0; 136 int dataSize; 137 byte[] tmp = new byte[20]; 138 byte[] buf = new byte[MAX_DATA_SIZE]; 139 140 fsInput.Position = 0; 141 if (isFirstFile) 142 { 143 if(FLV_HEADER_SIZE+4 == (fsInput.Read(tmp,0,FLV_HEADER_SIZE+4))) 144 { 145 fsMerge.Position = 0; 146 fsMerge.Write(tmp,0,FLV_HEADER_SIZE+4); 147 } 148 } 149 else 150 { 151 fsInput.Position = FLV_HEADER_SIZE + 4; 152 } 153 154 while(fsInput.Read(tmp, 0, FLV_TAG_HEADER_SIZE) > 0) 155 { 156 dataSize = FromInt24StringBe(tmp[1],tmp[2],tmp[3]); 157 curTimestamp = GetTimestamp(tmp[4],tmp[5],tmp[6],tmp[7]); 158 newTimestamp = curTimestamp + lastTimestamp; 159 SetTimestamp(tmp,4, newTimestamp); 160 fsMerge.Write(tmp,0,FLV_TAG_HEADER_SIZE); 161 162 readLen = dataSize+4; 163 if (fsInput.Read(buf,0,readLen) > 0) { 164 fsMerge.Write(buf, 0, readLen); 165 } else { 166 goto failed; 167 } 168 } 169 170 return newTimestamp; 171 172 failed: 173 throw new Exception("Merge Failed"); 174 } 测试通过,合并速度很快! 不过,这个方法有一个缺点:没有将各个文件里的关键帧信息合并,这个关键帧信息,切分flv文件时很重要,合并时就没那么重要了。如果确实需要的话,可以用yamdi来处理。 本文转自xiaotie博客园博客,原文链接:http://www.cnblogs.com/xiaotie/p/3441030.html,如需转载请自行联系原作者

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

CentOS 7 快速架设hadoop 2.5.1集群

1、软件准备a.OS:CentOS-7.0-1406-x86_64-DVD.iso --去CentOS官网下 b.JDK:jdk-7u71-linux-x64.gz --oracle官网下,至于1.8是否可行,没试 c.Hadoop: hadoop-2.5.1.tar.gz --hadoop官网下 d.虚拟机: VMware Player --小巧够用, 其他虚拟机也行2.环境介绍a.主机: 192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2 192.168.1.103 slave3 b.用户: Master SSH无密码登陆slaver 主机用户1: root 密码 hadoop 主机用户2: hadoop 密码 hadoop c.JDK位置: /usr/local 即/usr/local/jdk1.7.0_71 d.hadoop 位置: /opt 即/opt/hadoop-2.5.1 e.SSH公匙位置 /home/hadoop/.ssh/ 即hadoop用户的根目录下的.shh隐藏目录,hadoop登陆后 $cd ~/.ssh 可进入3、安装思路 由于master与slave除了IP地址不同外,其他配置基本相同(懒的话主机名不改都没问题^_^),所以思路就是配置好Master后将虚拟机复制,然后修改网络配置,将是最简单的办法。4、安装步骤a.建立虚拟机: 测试的话10G硬盘 2G RAM足够了),最小化安装centos7。其中: 分区自动 root密码 hadoop 另建立一个新用户hadoop 密码hadoop 主机名master(懒得后面改) ip地址设置静态(懒得后面配置,并启动网卡): IP:192.168.1.100 mask:255.255.255.0 gateway:192.168.1.1 DNS1:192.168.1.1 DNS2:8.8.8.8 b-关闭防火墙 systemctl stop firewalld.service --关闭防火墙 systemctl disable firewalld.service --永久关闭防火墙 c.增加五个工具(后续操作,若#都是root用户 $的都是hadoop用户,本节可选): --vim #yum -y install vim --ifconfig #yum -y net-tools --时间同步 #yum -y install ntp #ntpdate us.pool.ntp.org #cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --系统信息 #yum install -y sysstat --tree命令 #yum install -y tree d.修改hosts # vim /etc/hosts 按i进入插入模式,用#号注释掉已有,加入四行,: 192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2 192.168.1.103 slave3 按ESC :wq回车 e.修改ip 若安装没设置IP或者网卡没有启动: [root@master ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:3d:ed:03 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/24 brd 192.168.88.255 scope global eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe3d:ed03/64 scope link valid_lft forever preferred_lft forever 注意看2后面的eno16777736就是网卡名,然后编辑网卡配置: [root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 HWADDR=00:0C:29:3D:ED:03 TYPE=Ethernet BOOTPROTO=static ##重要,否则dhcp了 IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 BROADCAST=192.168.1.255 DNS1=192.168.1.1 DNS2=8.8.8.8 ONBOOT=yes ##重要,这个为no则系统启动不启动该网卡 至少保证以上信息,其他的不管,重启网络: #service network restart5、SSH无密码登陆#su hadoop $cd ~ $mkdir .ssh $chmod 744 .ssh ##权限重要,默认权限可以,本步骤可选 $ssh-keygen -t rsa -P '' ##ssh后无空格!!! $cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys ##将公钥追加到AuthorizedKeysFile $chmod 644 ~/.ssh/authorized_keys ##权限重要,默认权限不行 $su #vim /etc/ssh/sshd_config 去除前面的# RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys #service sshd restart #重启ssh服务 $su hadoop $ssh localhost 或ssh master Last login: Sat Nov 8 20:16:23 2014 #ssh无密码登陆成功6、连接网络共享,取得安装程序(懒人不架设FTP服务器)其中//192.168.1.9 是台windows 7的电脑,共享目录share,用户名密码均是share,里面放有下载好的JDK(jdk-7u71-linux-x64.gz)与 hadoop 2.5.1 (hadoop-2.5.1.tar.gz): #mkdir /mnt/share #建立共享文件挂载点 #mount -t cifs -o username="share",password="share" //192.168.1.9/share /mnt/share #cd /mnt/share 5.安装jdk #tar xzvf jdk-7u71-linux-x64.gz -C /usr/local/ #vim /etc/profile export JAVA_HOME=/usr/local/jdk1.7.0_71 export PATH=$PATH:$JAVA_HOME/bin #source /etc/profile ## 刷新系统配置 确认版本java安装成果 # java -version java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b14) Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)7、安装配置hadoop#cd /mnt/share #tar xzvf hadoop-2.5.1.tar.gz -C /opt/ #chown -R hadoop:hadoop /opt/hadoop-2.5.1 # vim /etc/profile ##修改系统配置 export HADOOP_HOME=/opt/hadoop-2.5.1 export PATH=$PATH:$HADOOP_HOME/bin # source /etc/profile ## 刷新系统配置 # su hadoop $ cd /opt/hadoop-2.5.1 $ mkdir -p dfs/name $ mkdir -p dfs/data $ mkdir -p tmp $ cd etc/hadoop a.配置所有slave节点 $ vim slaves slave1 slave2 slave3 b.修改hadoop-env.sh和yarn-env.sh $ vim hadoop-env.sh export JAVA_HOME=/usr/local/jdk1.7.0_71 $ vim yarn-env.sh export JAVA_HOME=/usr/local/jdk1.7.0_71 c.修改core-site.xml $ vim etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-2.5.1/tmp</value> </property> </configuration> 注意:/opt/hadoop-2.5.1/tmp前面不能有 file!!!与hdfs-site.xml不一样,而且所有内容中不能有空格,结尾处也不行!如<value>/opt/hadoop-2.5.1/tmp </value>会出错(tmp后有空格)。 d.修改hdfs-site.xml $ vim etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop-2.5.1/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop-2.5.1/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9001</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration> e.修改mapred-site.xml $ cd /opt/hadoop-2.5.1 $ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml $ vim etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> f.配置yarn-site.xml (a).伪分布配置: $ vim etc/hadoop/yarn-site.xml: <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> (b)集群配置: $ vim etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration>8、关机,复制三台slave#shutdown9、启动slave1,修改网卡配置与主机名#ip addr [root@master ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:fd:1d:23 brd ff:ff:ff:ff:ff:ff inet 192.168.88.11/24 brd 192.168.88.255 scope global eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe3d:ed03/64 scope link valid_lft forever preferred_lft forever 注意看2:后面的eno16777736就是网卡名,然后编辑网卡配置: # vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 HWADDR=00:0C:29:FD:1D:23 ##关键1,按刚才查出来的mac地址,eno16777736下面那行 TYPE=Ethernet BOOTPROTO=static ##关键2 IPADDR=192.168.1.101 ##关键3 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 BROADCAST=192.168.1.255 DNS1=192.168.1.1 DNS2=8.8.8.8 ONBOOT=yes ##关键4 至少保证以上信息 # service network restart --重启网络 修改主机名: # hostnamectl set-hostname slave110、启动slave2/slave2,修改网卡配置与主机名 11、格式化namenode$ cd /opt/hadoop-2.5.1 $ hdfs namenode -format12 启动hdfs$ ./sbin/start-dfs.sh $ ./sbin/start-yarn.sh --用pi程序测试: $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar pi 2 20000 13 检查启动情况http://192.168.1.100:8088 http://192.168.1.100:50070 14、关闭hadoop$ ./sbin/stop-all.sh 本文转自 tianya1993 51CTO博客,原文链接:http://blog.51cto.com/dreamlinux/1744348,如需转载请自行联系原作者

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

CentOS7下快速搭建Docker私有库

1. 安装Docker yum -y install docker 2. 启动Docker服务 systemctl enable docker systemctl start docker 3. 启动Docker私有库 mkdir /home/docker_repo cd /home/docker_repo docker run -d -p 5000:5000 --name registry --restart=always --privileged=true -v $PWD:/var/lib/registry registry:2 4. 提交Docker镜像 docker tag docker.io/hello-world:latest 192.168.1.75:5000/hello-world:latest docker push 192.168.1.75:5000/hello-world 如果push遇到问题,编辑/usr/lib/systemd/system/docker.service,在ExecStart=之后追加一行参数: --insecure-registry=192.168.1.75:5000 \ 然后重启Docker服务: systemctl daemon-reload systemctl restart docker 5. Docker私有库HTTP API 测试库内已有centos和Docker官方的hello-world镜像 查看当前库列表http://192.168.1.75:5000/v2/_catalog 返回: { "repositories": [ "centos", "hello-world" ] } 查看某个库标签列表http://192.168.1.75:5000/v2/hello-world/tags/list 返回: { "name": "hello-world", "tags": [ "latest" ] } 注: 需要把192.168.1.75替换成你的Docker私有库所在服务器IP 本文转自 zl1030 51CTO博客,原文链接:http://blog.51cto.com/zl1030/2047891

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

用户登录
用户注册