首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Opencv For IOS相机环境搭建

Step 1:next" title="" style="border:none;" data-original="https://img-blog.csdn.net/20160627165528648"> Step 2:导入有用的framework opencv2.framework需要自己下载 opencv2.framework如下导入方式 其他 .framework如下方式导入 导入framework后如下图所示 Step 3: 下图1的位置将.m文件改为.mm文件 Step 4: 添加protocol 这个delegate可以用来出来获取的视频图像 Step 5:创建一个CvVideoCamera的实例 @property (nonatomic,strong) CvVideoCamera *videoCamera; Step 6:将videoCamera对象与imageView连接: self.videoCamera = [[CvVideoCamera alloc] initWithParentView:self.imageView]; self.videoCamera.delegate = self; self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;//调用摄像头前置或者后置 self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;//设置图像分辨率 self.videoCamera.rotateVideo=YES;// 解决图像显示旋转90°问题 self.videoCamera.grayscaleMode = NO;//获取图像是灰度还是彩色图像 self.videoCamera.defaultFPS = 30;//摄像头频率 只要简单的设置,现在videoCamera已经就绪了,只需要以下命令: [self.videoCamera start]; [self.videoCamera stop]; 进行控制 Step 7:对获取的实时图像进行处理 利用protocol的method: -(void)processImage:(cv::Mat &)image { //添加自己的图像处理算法 if (!image.empty()) { if(image.channels()==4) { cv::Mat gray; cv::cvtColor(image, gray, CV_BGRA2GRAY); cv::GaussianBlur(gray, gray, cv::Size(5,5), 1.2, 1.2); cv::Mat edges; cv::Canny(gray, edges, 0, 60); image.setTo(cv::Scalar::all(255)); image.setTo(cv::Scalar(0,128,255,255), edges); self.imageView.image = MatToUIImage(image); }else if(image.channels()==3) { cv::Mat gray; cv::cvtColor(image, gray, CV_RGB2GRAY); cv::GaussianBlur(gray, gray, cv::Size(5,5), 1.2, 1.2); cv::Mat edges; cv::Canny(gray, edges, 0, 60); image.setTo(cv::Scalar::all(255)); image.setTo(cv::Scalar(0,128,255,255), edges); self.imageView.image = MatToUIImage(image); } else if(image.channels()==1){ cv::Mat gray; cv::GaussianBlur(image, gray, cv::Size(5,5), 1.2, 1.2); cv::Mat edges; cv::Canny(gray, edges, 0, 60); image.setTo(cv::Scalar::all(255)); image.setTo(cv::Scalar(0,128,255,255), edges); self.imageView.image = MatToUIImage(image); } else{ } } } 有时会出现如下错误 ld: ‘/Users///*/opencv2.framework/opencv2(cap_ios_video_camera.o)’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64 Build Phases 收索bit code 将Enable Bitcode 后面的Yes改为No。 Opencv+IOS源码 Opencv For IOS 配置视频

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

keepalived+lvs简单搭建

实现Keepalived+Lvs , 主要做 RealServer 健康检查及LoadBalance 主机与Master,Backup 主机正常运行,其中一部分主机做高可用,另一部分做负载均衡。通过在HA 主机上安装 keepalived 服务形成主备形式并进行 rr 轮询调度,使用VIP 来 Director向客户端提供服务 IP,Keepalived 能在服务器出现故障时将其从系统中剔除并将服务改换至其他正常节点,当坏掉的节点恢复正常时能够将其加入到服务器集群中,并在实时发现故障时能够发送警告到指定邮箱。 主机环境:RHEL6 X86 (selinux&iptables disabled) 实验主机: LVS ‐ ACTIVE: 192.168.122.103(server3) LVS ‐ BACKUP: 192.168.122.104(server4) LVS ‐ VIP: 192.168.122.111(vip) Realsever: 192.168.122.101(server1) 192.168.122.102(server2) SOFT :keepalived-1.2.20 LVS(Server3,server4)配置: [root@server3 ~]#cd /mnt/ [root@server3mnt]# ls keepalived-1.2.20.tar.gz [root@server3mnt]# tar zxf keepalived-1.2.20.tar.gz [root@server3mnt]# ls keepalived-1.2.20 keepalived-1.2.20.tar.gz [root@server3mnt]# cd keepalived-1.2.20 [root@server3keepalived-1.2.20]# ./configure --prefix=/usr/local/keepalived (看来是缺少C编译器了,我们安装上GCC) [root@server3keepalived-1.2.20]# yum install gcc [root@server3keepalived-1.2.20]#./configure --prefix=/usr/local/keepalived (还缺少 openssl) 太麻烦了查了查执行 yum install ipvsadmkernel-devel openssl-devel popt-devel libnl-devel gcc make -y 一次安装完 居然还少东西,libnfnetlink-devel这个东西没有 我在我的rhel6.5镜像里面居然没有搜索到这个东西,在网上搜索下载后安装即可重新编译。 成功无报错. [root@server3keepalived-1.2.20]# cd /usr/local/keepalived/ 执行4个软链接 ln -s/usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ (启动脚本,可方便调用) ln -s/usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/ (引用启动脚本变量的文件) ln -s/usr/local/keepalived/etc/keepalived/etc/ (方便使用) ln -s/usr/local/keepalived/sbin/keepalived/usr/sbin (环境变量添加) scp -r/usr/local/keepalived/ root@172.25.33.4:/usr/local/(发到SERVER4后也需要四个链接) vim /etc/keepalived/keepalived.conf Scp /etc/keepalived/keepalived.conf root@192.168.122.104:/etc/keepalived/ 将设置文件拷入BACKUP机中,然后作以下修改 启动server3&server4上的keepalived服务 /etc/init.d/keepalived start 在两个real_server上添加 ip addr add192.168.122.111/32 dev eth0 浏览器 192.168.122.101上显示 浏览器 192.168.122.102上显示 在浏览器输入 http://192.168.122.111,会出现 刷新一下 会发现在权重都为1时,虚拟IP所显示的为192.168.122.101和 192.168.122.102的轮流替换,实现了负载均衡的功能。 高可用测试:停止master 上的 keepalived 服务,看backup 是否接管。 如上图,在BACKUP机测试,关掉MASTER后BACKUP进入了MASTER状态。当恢复MASTER机的服务后,如下 可以看到备机重新恢复了BACKUP标签状态。 这样,简单的keepalived和lvs的功能就得以实现了。

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

ELK stack 日志系统搭建

ELK stack是什么? ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故有此简称。 ELK Stack 在最近两年迅速崛起,成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。和传统的日志处理方案相比,ELK Stack 具有如下几个优点: 处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用; 配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计; 检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应; 集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的; 前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。 以上摘自ELKstack中文指南 Logstash是能够用于收集,处理和转发事件或日志信息的工具. Logstash : Logstash服务的组件,用于处理日志 Elasticsearch : 用于存储,索引日志Kibana 4: 搜索和可视化的日志的Web界面.Elasticsearch和Logstash需要运行Java环境,并且版本最好是1.7以上. 首先必须安装java7及以上的版本 http://www.java.com/zh_CN/download/linux_manual.jsp [root@192_168_174_68 home]# wget 'http://sdlc-esd.oracle.com/ESD6/JSCDL/jdk/8u73-b02/jre-8u73-linux-x64.rpm?GroupName=JSC&FilePath=/ESD6/JSCDL/jdk/8u73-b02/jre-8u73-linux-x64.rpm&BHost=javadl.sun.com&File=jre-8u73-linux-x64.rpm&AuthParam=1457343423_73675d83c3aa00d667217e09e10d85c2&ext=.rpm' -O jre-8u73-linux-x64.rpm --2016-03-07 17:18:01-- http://sdlc-esd.oracle.com/ESD6/JSCDL/jdk/8u73-b02/jre-8u73-linux-x64.rpm?GroupName=JSC&FilePath=/ESD6/JSCDL/jdk/8u73-b02/jre-8u73-linux-x64.rpm&BHost=javadl.sun.com&File=jre-8u73-linux-x64.rpm&AuthParam=1457343423_73675d83c3aa00d667217e09e10d85c2&ext=.rpm Resolving sdlc-esd.oracle.com... 96.7.54.179, 96.7.54.187 Connecting to sdlc-esd.oracle.com|96.7.54.179|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 49210622 (47M) [application/x-sdlc] Saving to: “jre-8u73-linux-x64.rpm” 100%[=================================================>] 49,210,622 1.58M/s in 31s 2016-03-07 17:18:32 (1.51 MB/s) - “jre-8u73-linux-x64.rpm” saved [49210622/49210622] 安装jdk [root@192_168_174_68 home]# yum install jre-8u73-linux-x64.rpm -y [root@192_168_174_68 home]# java -version java version "1.8.0_73" Java(TM) SE Runtime Environment (build 1.8.0_73-b02) Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode) Elasticsearch 2.2.0安装 YUM / DNF安装 下载并安装公钥: [root@192_168_174_68 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch 创建/etc/yum.repos.d/elasticsearch.repo文件,复制下面的内容到文件中 [root@192_168_174_68 ~]# vim /etc/yum.repos.d/elasticsearch.repo [elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=https://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch enabled=1 安装elasticsearch [root@192_168_174_68 ~]# yum install elasticsearch #新版本的Fedora使用dnf install elasticsearch 配置elasticsearch服务自动启动,SysV init 版本使用 chkconfig --add elasticsearch systemd使用: sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable elasticsearch.service 修改elasticsearch配置 [root@192_168_174_68 ~]# mkdir /opt/elasticsearch.path.data [root@192_168_174_68 elasticsearch]# vim /etc/elasticsearch/elasticsearch.yml path.data: /opt/elasticsearch.path.data network.host: 0.0.0.0 启动服务: [root@192_168_174_68 opt]# service elasticsearch start Starting elasticsearch: [ OK ] [root@192_168_174_68 opt]# ps aux |grep elastic 498 8171 24.3 3.2 6815980 263784 ? Sl 17:24 0:10 /usr/bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-2.2.0.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch start -p /var/run/elasticsearch/elasticsearch.pid -d -Des.default.path.home=/usr/share/elasticsearch -Des.default.path.logs=/var/log/elasticsearch -Des.default.path.data=/var/lib/elasticsearch -Des.default.path.conf=/etc/elasticsearch root 8283 0.0 0.0 103252 844 pts/1 S+ 17:25 0:00 grep elastic [root@192_168_174_68 opt]# netstat -lntp |grep 8171 tcp 0 0 ::ffff:127.0.0.1:9200 :::* LISTEN 8171/java tcp 0 0 ::1:9200 :::* LISTEN 8171/java tcp 0 0 ::ffff:127.0.0.1:9300 :::* LISTEN 8171/java tcp 0 0 ::1:9300 :::* LISTEN 8171/java [root@192_168_174_68 opt]# 服务已经启动. kibana4.4.1安装: 在下载主界面,有这么一行字,所以要注意与安装的elasticsearch相匹配.Note: Kibana 4.4.1 requires Elasticsearch 2.2. 下载安装包. [root@192_168_174_68 ~]# wget https://download.elastic.co/kibana/kibana/kibana-4.4.1-linux-x64.tar.gz [root@192_168_174_68 ~]# tar zxvf kibana-4.4.1-linux-x64.tar.gz -C /opt/ [root@192_168_174_68 ~]# cd /opt/kibana-4.4.1-linux-x64/ 修改配置文件 [root@192_168_174_68 kibana-4.4.1-linux-x64]# vim config/kibana.yml server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://192.168.174.68:9200" 启动服务 [root@192_168_174_68 kibana-4.4.1-linux-x64]# nohup ./bin/kibana -l /var/log/kibana4.4.1.log & [1] 8867 nohup: ignoring input and appending output to `nohup.out' logstash安装 YUM源安装方式 下载安装公钥 rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch 创建/etc/yum.repo.d/logstash.repo文件 [root@192_168_174_68 ~]# vim /etc/yum.repos.d/logstash.repo [logstash-2.2] name=Logstash repository for 2.2.x packages baseurl=http://packages.elastic.co/logstash/2.2/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1 [root@192_168_174_68 ~]# yum install logstash -y 测试: [root@192_168_174_68 logstash]# JAVA_HOME=/usr/java/jre1.8.0_73 && /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }' Settings: Default pipeline workers: 8 Logstash startup completed talen 2016-03-07T09:51:08.290Z 192_168_174_68 talen 测试OK 下面使用log4j模块收集日志 从Log4j SocketAppender通过TCP读取事件.只支持log4j 1.x版本.根据配置mode的不同,可以接受客户端连接也可以连接到服务端.根据mode不同,必需在对端配置SocketAppender或SocketHubAppender. 编辑业务的log4j配置,添加如下信息 log4j.rootLogger=logstash log4j.appender.logstash=org.apache.log4j.net.SocketAppender log4j.appender.logstash.port=56789 log4j.appender.logstash.remoteHost=192.168.174.68 修改logstash配置信息 [root@192_168_174_68 ~]# cat /etc/logstash/conf.d/3rd.conf input { log4j { mode => "server" host => "0.0.0.0" port => 56789 type => "log4j" } } #The geoip plugin configuration requires data that is already defined as separate fields. Make sure that the geoip section is after the grok section of the configuration file. output { elasticsearch { hosts => "192.168.174.68:9200" } } 在浏览器中输入http://192.168.174.68:5601,可以看到收集上来的日志 问题一: [root@192_168_174_68 ~]# service elasticsearch start Starting elasticsearch: Exception in thread "main" java.lang.IllegalStateException: Unable to access 'path.data' (/opt/elasticsearch.path.data/elasticsearch) Likely root cause: java.nio.file.AccessDeniedException: /opt/elasticsearch.path.data/elasticsearch at sun.nio.fs.UnixException.translateToIOException(Unknown Source) at sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) at sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) at sun.nio.fs.UnixFileSystemProvider.createDirectory(Unknown Source) at java.nio.file.Files.createDirectory(Unknown Source) at java.nio.file.Files.createAndCheckIsDirectory(Unknown Source) at java.nio.file.Files.createDirectories(Unknown Source) at org.elasticsearch.bootstrap.Security.ensureDirectoryExists(Security.java:337) at org.elasticsearch.bootstrap.Security.addPath(Security.java:314) at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:259) at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:212) at org.elasticsearch.bootstrap.Security.configure(Security.java:118) at org.elasticsearch.bootstrap.Bootstrap.setupSecurity(Bootstrap.java:196) at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:167) at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:285) at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35) Refer to the log for complete error details. [FAILED] 解决: [root@192_168_174_68 opt]# chmod 777 /opt/elasticsearch.path.data/ 参考: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html https://www.ttlsa.com/elk/howto-install-elasticsearch-logstash-and-kibana-elk-stack/

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

hadoop学习笔记--集群搭建

注:大家常说的ssh其实就是一个免密码访问的东西,为了简化操作的,不用每次访问其他节点重新输入密码。但是要想配置如下: 1.在每台机器上执行 ssh-keygen -t rsa,连敲三次回车键(即设置空密码) 2.然后在每台机器上都执行cd ~/.ssh,并分别把id_rsa.pub复制到authorized_keys中, 即执行 cp id_rsa.pub authorized_keys 3.然后分别把slave0,slave1的authorized_keys都复制到master主节点的authorized_keys中, 即分别在两个从节点slave0和slave1中执行 ssh-copy-id -i master 4.再分别复制到slave0,slave1中(即每一个节点的authorized_keys中都有这三个节点的密钥) 即在主节点master上执行 scp -r ~/.ssh/authorized_keys slave0:~/.ssh/ scp -r ~/.ssh/authorized_keys slave1:~/.ssh/ 此时成功。 简单测试:比如说在master上执行ssh slave0,这时候发现不需要输入密码即可转 到slave0从节点上,这时成功 hadoop-0.20.2的配置文件 hadoop-0.20.0的配置文件: core-site.xml <property> <name>fs.default.name</name> <value>hdfs://cMaster:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/joe/cloudData</value> </property> hdfs-site.xml <property> <name>dfs.name.dir</name> <value>/home/joe/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> <value>/home/joe/hdfs/data</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> mapred-site.xml <property> <name>mapred.job.tracker</name> <value>cMaster:9001</value> </property> hadoop-0.20.2集群操作命令: hadoop-0.20.2的集群操作命令 上传本地文件至hdfs:[rio@cMaster hadoop-0.20.2]#bin/hadoop dfs -put /home/rio/input/* /in 用WordCount计算数据:[rio@cMaster hadoop-2.2.0]#bin/hadoop jar hadoop-0.20.2-examples.jar wordcount /in /out/wc-01 hadoop-2.2.0的配置文件: hadoop-2.2.0的配置文件: core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://cMaster:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/joe/cloudData</value> </property> yarn-site.xml <property> <name>yarn.resourcemanager.hostname</name> <value>cMaster</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> mapred-site.xml(注:将mapred-site.xml.template重命名为mapred-site.xml) <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> hadoop-2.2.0进程启动命令: 启动(或关闭)全部服务:[rio@cMaster hadoop-2.2.0]#sbin/start-all.sh [rio@cMaster hadoop-2.2.0]#sbin/stop-all.sh 格式化主节点:[rio@cMaster hadoop-2.2.0]#bin/hdfs namenode -format(注:仅格式化一次) 启动主节点上的namenode:[rio@cMaster hadoop-2.2.0]#sbin/hadoop-daemon.sh start namenode 启动主节点上的resourcemanager:[rio@cMaster hadoop-2.2.0]#sbin/yarn-daemon.sh start resourcemanager 启动从节点上的datanode:[rio@cMaster hadoop-2.2.0]#sbin/hadoop-daemon.sh start datanode 启动从节点上的nodemanager:[rio@cMaster hadoop-2.2.0]#sbin/yarn-daemon.sh start nodemanager 启动日志历史查询:[rio@cMaster hadoop-2.2.0]#sbin/mr-jobhistory-daemon.sh start historyserver 查看服务是否启动:[rio@cMaster hadoop-2.2.0]#/usr/java/jdk1.8.0_71/bin/jps hadoop-2.2.0集群操作命令: 创建目录:[rio@cMaster hadoop-2.2.0]#bin/hdfs dfs -mkidr /in 删除文件及目录:[rio@cMaster hadoop-2.2.0]#bin/hdfs dfs -rmr /out/input 上传本地文件至hdfs:[rio@cMaster hadoop-2.2.0]#bin/hdfs dfs -put /home/rio/input/* /in 查看hdfs里的文件:[rio@cMaster hadoop-2.2.0]#bin/hdfs dfs -cat /in/* [rio@cMaster hadoop-2.2.0]#bin/hdfs dfs -cat /out/wc-01/* 用WordCount计算数据:[rio@cMaster hadoop-2.2.0]#bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-example-2.2.0.jar wordcount /in /out/wc-01 当神已无能为力,那便是魔渡众生

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

二、hadoop伪分布搭建

环境 虚拟机:VirtualBox Ubuntu:14.04 hadoop:2.6 安装 1、创建hadoop用户 sudo useradd -m hadoop -s/bin/bash 【Ubuntu终端复制粘贴快捷键】 【在Ubuntu终端窗口中,复制粘贴的快捷键需要加上shift,即粘贴是 ctrl+shift+v。】 使用如下命令修改密码,按提示输入两次密码 hadoop : sudo passwd hadoop 可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题: sudo adduser hadoop sudo 2、切换到hadoop用户下 su hadoop 3、安装SSH server、配置SSH无密码登陆 集群、单节点模式都需要用到SSH登陆(类似于远程登陆,你可以登录某台Linux电脑,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server: sudo apt-get install openssh-server 安装后,可以使用如下命令登陆本机: ssh localhost 此时会有提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码hadoop,这样就登陆到本机了。 但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。 首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中: exit # 退出刚才的 ssh localhost cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost ssh-keygen -t rsa # 会有提示,都按回车就可以 cat id_rsa.pub >> authorized_keys # 加入授权 此时再用 ssh localhost 命令,无需输入密码就可以直接登陆 4、安装Java环境 Java环境可选择 Oracle 的 JDK,或是 OpenJDK,按http://wiki.apache.org/hadoop/HadoopJavaVersions中说的,新版本在 OpenJDK 1.7 下是没问题的。为图方便,这边直接通过命令安装 OpenJDK 7。 sudo apt-get install openjdk-7-jre openjdk-7-jdk OpenJDK 默认的安装位置为: /usr/lib/jvm/java-7-openjdk-amd64 (32位系统则是 /usr/lib/jvm/java-7-openjdk-i86 ,可通过命令dpkg -L openjdk-7-jdk查看到)。安装完后就可以使用了,可以用java -version 检查一下。 接着需要配置一下 JAVA_HOME 环境变量,为方便,我们在 ~/.bashrc 中进行设置(扩展阅读:设置Linux环境变量的方法和区别): vi ~/.bashrc 在文件最前面添加如下单独一行(注意 = 号前后不能有空格),并保存: export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 如下图所示(该文件原本可能不存在,内容为空,这不影响): 配置JAVA_HOME变量 接着还需要让该环境变量生效,执行如下代码: source ~/.bashrc# 使变量设置生效 echo $JAVA_HOME# 检验是否设置正确 设置正确的话,会输出如下结果: 成功配置JAVA_HOME变量 5、安装hadoop 进入hadoop所在的目录将其解压到/usr/local/hadoop sudo tar -zxvf ./hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中 cd /usr/local/ sudo mv ./hadoop-2.6.0/ ./hadoop # 将文件夹名改为hadoop sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限 Hadoop解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示命令用法: cd ./hadoop ./bin/hadoop 6、hadoop伪分布配置 Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件core-site.xml 和hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。 修改配置文件 core-site.xml (vim /usr/local/hadoop/etc/hadoop/core-site.xml),将当中的 <configuration> </configuration> 修改为下面配置: <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> 同样的,修改配置文件 hdfs-site.xml: <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration> 修改配置文件 yarn-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 配置完成后,执行 namenode 的格式 bin/hdfs namenode -format 成功的话,会看到successfully formatted 的提示,且倒数第5行的提示如下,Exitting with status 0 表示成功,若为Exitting with status 1 则是出错 接着开启如下进程 sbin/start-dfs.sh sbin/start-yarn.sh 至此,所有的已经安装完事,且所有服务都已经启动 验证 http://127.0.0.1:8088 http://localhost:50070 http://127.0.0.1:19888 提示 每次进入虚拟机系统时必须先进入hadoop用户下(su hadoop),才能开启服务,否则会报错 参考文章:www.powerxing.com/install-hadoop/ QQ交流:1923361654 hadoop完全分布式部署参考:http://blog.csdn.net/gamer_gyt/article/details/51991893 hadoop单机版部署参考:http://blog.csdn.net/gamer_gyt/article/details/46545303

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

动态规划基础思想

本页面主要介绍了动态规划的基本思想,以及动态规划中状态及状态转移方程的设计思路,帮助各位初学者对动态规划有一个初步的了解。 本部分的其他页面,将介绍各种类型问题中动态规划模型的建立方法,以及一些动态规划的优化技巧。 引入 [IOI1994] 数字三角形](https://www.luogu.com.cn/problem/P1216)" 给定一个 $r$ 行的数字三角形($r \leq 1000$),需要找到一条从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到当前点左下方的点或右下方的点。 ```plain 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ``` 在上面这个例子中,最优路径是 $7 \to 3 \to 8 \to 7 \to 5$。 最简单粗暴的思路是尝试所有的路径。因为路径条数是 $O(2^r)$ 级别的,这样的做法无法接受。 注意到这样一个事实,一条最优的路径,它的每一步决策都是最优的。 以例题里提到的最优路径为例,只考虑前四步 $7 \to 3 \to 8 \to 7$,不存在一条从最顶端到 $4$ 行第 $2$ 个数的权值更大的路径。 而对于每一个点,它的下一步决策只有两种:往左下角或者往右下角(如果存在)。因此只需要记录当前点的最大权值,用这个最大权值执行下一步决策,来更新后续点的最大权值。 这样做还有一个好处:我们成功缩小了问题的规模,将一个问题分成了多个规模更小的问题。要想得到从顶端到第 $r$ 行的最优方案,只需要知道从顶端到第 $r-1$ 行的最优方案的信息就可以了。 这时候还存在一个问题:子问题间重叠的部分会有很多,同一个子问题可能会被重复访问多次,效率还是不高。解决这个问题的方法是把每个子问题的解存储下来,通过记忆化的方式限制访问顺序,确保每个子问题只被访问一次。 上面就是动态规划的一些基本思路。下面将会更系统地介绍动态规划的思想。 动态规划原理 能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。 最优子结构 具有最优子结构也可能是适合用贪心的方法求解。 注意要确保我们考察了最优解中用到的所有子问题。 证明问题最优解的第一个组成部分是做出一个选择; 对于一个给定问题,在其可能的第一步选择中,假定你已经知道哪种选择才会得到最优解。你现在并不关心这种选择具体是如何得到的,只是假定已经知道了这种选择; 给定可获得的最优解的选择后,确定这次选择会产生哪些子问题,以及如何最好地刻画子问题空间; 证明作为构成原问题最优解的组成部分,每个子问题的解就是它本身的最优解。方法是反证法,考虑加入某个子问题的解不是其自身的最优解,那么就可以从原问题的解中用该子问题的最优解替换掉当前的非最优解,从而得到原问题的一个更优的解,从而与原问题最优解的假设矛盾。 要保持子问题空间尽量简单,只在必要时扩展。 最优子结构的不同体现在两个方面: 原问题的最优解中涉及多少个子问题; 确定最优解使用哪些子问题时,需要考察多少种选择。 子问题图中每个定点对应一个子问题,而需要考察的选择对应关联至子问题顶点的边。 无后效性 已经求解的子问题,不会再受到后续决策的影响。 子问题重叠 如果有大量的重叠子问题,我们可以用空间将这些子问题的解存储下来,避免重复求解相同的子问题,从而提升效率。 基本思路 对于一个能用动态规划解决的问题,一般采用如下思路解决: 将原问题划分为若干 阶段,每个阶段对应若干个子问题,提取这些子问题的特征(称之为 状态); 寻找每一个状态的可能 决策,或者说是各状态间的相互转移方式(用数学的语言描述就是 状态转移方程)。 按顺序求解每一个阶段的问题。 如果用图论的思想理解,我们建立一个 有向无环图,每个状态对应图上一个节点,决策对应节点间的连边。这样问题就转变为了一个在 DAG 上寻找最长(短)路的问题(参见:DAG 上的 DP)。 最长公共子序列 ???+ note "最长公共子序列问题" 给定一个长度为 $n$ 的序列 $A$ 和一个 长度为 $m$ 的序列 $B$($n,m \leq 5000$),求出一个最长的序列,使得该序列既是 $A$ 的子序列,也是 $B$ 的子序列。 子序列的定义可以参考 子序列。一个简要的例子:字符串 abcde 与字符串 acde 的公共子序列有 a、c、d、e、ac、ad、ae、cd、ce、de、ade、ace、cde、acde,最长公共子序列的长度是 4。 设 $f(i,j)$ 表示只考虑 $A$ 的前 $i$ 个元素,$B$ 的前 $j$ 个元素时的最长公共子序列的长度,求这时的最长公共子序列的长度就是 子问题。$f(i,j)$ 就是我们所说的 状态,则 $f(n,m)$ 是最终要达到的状态,即为所求结果。 对于每个 $f(i,j)$,存在三种决策:如果 $A_i=B_j$,则可以将它接到公共子序列的末尾;另外两种决策分别是跳过 $A_i$ 或者 $B_j$。状态转移方程如下: $$ f(i,j)=\begin{cases}f(i-1,j-1)+1&A_i=B_j\\max(f(i-1,j),f(i,j-1))&A_i\ne B_j\end{cases} $$ 可参考 SourceForge 的 LCS 交互网页 来更好地理解 LCS 的实现过程。 该做法的时间复杂度为 $O(nm)$。 另外,本题存在 $O\left(\dfrac{nm}{w}\right)$ 的算法[^ref1]。有兴趣的同学可以自行探索。 int a[MAXN], b[MAXM], f[MAXN][MAXM]; int dp() { for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (a[i] == b[j]) f[i][j] = f[i - 1][j - 1] + 1; else f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); return f[n][m]; } 最长不下降子序列 ???+ note "最长不下降子序列问题" 给定一个长度为 $n$ 的序列 $A$($n \leq 5000$),求出一个最长的 $A$ 的子序列,满足该子序列的后一个元素不小于前一个元素。 算法一 设 $f(i)$ 表示以 $A_i$ 为结尾的最长不下降子序列的长度,则所求为 $\max_{1 \leq i \leq n} f(i)$。 计算 $f(i)$ 时,尝试将 $A_i$ 接到其他的最长不下降子序列后面,以更新答案。于是可以写出这样的状态转移方程:$f(i)=\max_{1 \leq j < i, A_j \leq A_i} (f(j)+1)$。 容易发现该算法的时间复杂度为 $O(n^2)$。 === "C++" ```cpp int a[MAXN], d[MAXN]; int dp() { d[1] = 1; int ans = 1; for (int i = 2; i <= n; i++) { d[i] = 1; for (int j = 1; j < i; j++) if (a[j] <= a[i]) { d[i] = max(d[i], d[j] + 1); ans = max(ans, d[i]); } } return ans; } ``` === "Python" python a = [0] * MAXN d = [0] * MAXN def dp(): d[1] = 1 ans = 1 for i in range(2, n + 1): for j in range(1, i): if a[j] <= a[i]: d[i] = max(d[i], d[j] + 1) ans = max(ans, d[i]) return ans 算法二[^ref2] 当 $n$ 的范围扩大到 $n \leq 10^5$ 时,第一种做法就不够快了,下面给出了一个 $O(n \log n)$ 的做法。 回顾一下之前的状态:$(i, l)$。 但这次,我们不是要按照相同的 $i$ 处理状态,而是直接判断合法的 $(i, l)$。 再看一下之前的转移:$(j, l - 1) \rightarrow (i, l)$,就可以判断某个 $(i, l)$ 是否合法。 初始时 $(1, 1)$ 肯定合法。 那么,只需要找到一个 $l$ 最大的合法的 $(i, l)$,就可以得到最终最长不下降子序列的长度了。 那么,根据上面的方法,我们就需要维护一个可能的转移列表,并逐个处理转移。 所以可以定义 $a_1 \dots a_n$ 为原始序列,$d_i$ 为所有的长度为 $i$ 的不下降子序列的末尾元素的最小值,$len$ 为子序列的长度。 初始化:$d_1=a_1,len=1$。 现在我们已知最长的不下降子序列长度为 1,那么我们让 $i$ 从 2 到 $n$ 循环,依次求出前 $i$ 个元素的最长不下降子序列的长度,循环的时候我们只需要维护好 $d$ 这个数组还有 $len$ 就可以了。关键在于如何维护。 考虑进来一个元素 $a_i$: 元素大于等于 $d_{len}$,直接将该元素插入到 $d$ 序列的末尾。 元素小于 $d_{len}$,找到 第一个 大于它的元素,用 $a_i$ 替换它。 为什么: 对于步骤 1: 由于我们是从前往后扫,所以说当元素大于等于 $d_{len}$ 时一定会有一个不下降子序列使得这个不下降子序列的末项后面可以再接这个元素。如果 $d$ 不接这个元素,可以发现既不符合定义,又不是最优解。 对于步骤 2: 同步骤 1,如果插在 $d$ 的末尾,那么由于前面的元素大于要插入的元素,所以不符合 $d$ 的定义,因此必须先找到 第一个 大于它的元素,再用 $a_i$ 替换。 步骤 2 如果采用暴力查找,则时间复杂度仍然是 $O(n^2)$ 的。但是根据 $d$ 数组的定义,又由于本题要求不下降子序列,所以 $d$ 一定是 单调不减 的,因此可以用二分查找将时间复杂度降至 $O(n\log n)$. 参考代码如下: === "C++" cpp for (int i = 0; i < n; ++i) scanf("%d", a + i); memset(dp, 0x1f, sizeof dp); mx = dp[0]; for (int i = 0; i < n; ++i) { *std::upper_bound(dp, dp + n, a[i]) = a[i]; } ans = 0; while (dp[ans] != mx) ++ans; === "Python" python dp = [0x1f1f1f1f] * MAXN mx = dp[0] for i in range(0, n): bisect.insort_left(dp, a[i], 0, len(dp)) ans = 0 while dp[ans] != mx: ans += 1 参考资料与注释 [^ref1]: 位运算求最长公共子序列 - -Wallace- - 博客园 [^ref2]: 最长不下降子序列 nlogn 算法详解 - lvmememe - 博客园 AI算法蒋同学致力于信息学奥赛教学、人工智能算法研究工作! B站 ! 淘宝 !

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

Django框架基础步骤

Python云框架 mysite/ 外层目录,可更改名字 mysite/ 工程目录,保存代码和文件 _init_.py 一个将mysite定义为包的空文件 settings.py 部署和配置整个工程的配置文件(配置文件) urls.py URL路由的声明文件(路由文件) wsgi.py 基于WSGI的web服务器的配置文件 manage.py 一个与Django工程进行交互的命令工具 django-admin //Django框架全局管理工具 django-admin <command> [options] 作用: 建立并管理Django工程 建立并管理Django工程使用的数据库 控制调试或日志信息 运行并维护Django工程 manage.py \>python manage.py <command> [options] //只针对当前生成的工程 步骤: 步骤1:新建工程:Django-admin startproject mysite 步骤2-1:修改工程 :创建一个具体应用(app) 步骤2-2:修改工程:修改应用的views.py:对URL的具体响应功能 步骤2-3:修改工程:修改URL路由:指定URL与响应之间的关系 步骤3:运行工程:Python manage.py mysite 云端web系统的三个通用功能需求 1.数据组织 2.web展示 3.控制逻辑 MTV开发模式 M:模型 与数据组织相关的功能 T:Templates模板 与表现相关的所有功能(定义表现风格) V:视图 针对请求数据的功能 选择展示数据,显示数据模板,每个URL对应一个回调函数

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

MySQL实战——基础架构

本文属于个人备忘录,主要是极客时间《MySQL实战45讲》学习笔记。 MySQL架构 MySQL 可以分为 Server 层和存储引擎层两部分。不同的存储引擎共用一个Server层。 Server层 概述 Server层包括 连接器 查询缓存 分析器 优化器 执行器 ... Server层功能 MySQL大多数核心服务功能 所有的内置函数,如日期、时间、数学和加密函数等 跨存储引擎的功能,如存储过程、触发器、视图等 连接器 连接器做什么? 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 连接命令示例 mysql -h$ip -P$port -u$user -p 其中,mysql是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。 如果用户名或密码不对,会收到"Access denied for user"错误,客户端结束执行 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。 这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。 权限修改完成后,只有再新建的连接才会使用新的权限设置。 连接完成后,如果没有后续的动作,这个连接就处于空闲状态,可以用show processlist命令看该链接状态。如下。 其中Command列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。 mysql> show processlist; +----+----------+-----------------+---------+---------+--------+-----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+----------+-----------------+---------+---------+--------+-----------+------------------+ | 28 | testuser | localhost:60453 | db_test | Sleep | 8 | | NULL | | 29 | testuser | localhost:53231 | db_test | Query | 0 | starting | show processlist | +----+----------+-----------------+---------+---------+--------+-----------+------------------+ 25 rows in set (0.00 sec) 客户端如果太长时间没动静,连接器会自动断开。这个时间是由参数wait_timeout控制的,默认值是8小时。 mysql> show variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout | 28800 | +---------------+-------+ 1 row in set (0.01 sec) mysql> 如果在连接被断开之后,客户端再次发送请求的话,会收到一个错误:Lost connection to MySQL server during query。这时候如果要继续,就需要重连后再执行请求。 什么是长连接? 长连接:指连接成功后,如果客户端持续有请求,则一直使用同一个连接。 建立连接的过程通常比较复杂,建议使用中要尽量减少建立连接的动作,即尽量使用长连接。 什么是短连接? 短连接:指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。 长连接的影响 影响 全部使用长连接后,可能会发现,有些时候MySQL占用内存涨得特别快。 如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),看起来是MySQL异常重启。 原因 是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。 解决办法 定期断开长连接。 使用一段时间,或者程序里面判断执行过一个占用内存的大查询后断开连接,之后查询时再重连。 执行mysql_reset_connection重新初始化连接资源 MySQL >= 5.7版本 在每次执行一个比较大的操作后,重新初始化链接资源 这个过程不需要重连和重新鉴权,但是会将连接恢复到刚刚创建完时的状态 查询缓存 连接建立完成后,就可以进行查询了。MySQL接到一个查询请求后,会先查询缓存。 如果语句在缓存中,则其对应的结果会被直接返回给客户端,以提高查询效率。 如果语句不在缓存中,会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。 但是大多数情况下不要使用查询缓存。因为查询缓存往往弊大于利。 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。 不使用缓存 对于更新压力大的数据库来说,查询缓存的命中率会非常低。 可使用缓存 业务是一张静态表,很长时间才会更新一次。 比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。 可通过设置参数query_cache_type来设置要不要使用查询缓存。 DEMAND 默认都不使用查询缓存 SQL_CACHE 显式指定使用查询缓存,如 mysql> select SQL_CACHE * from T where ID=10; 通常情况下,该参数设置为OFF,即关闭查询缓存即可。 mysql> show variables like 'query_cache_type'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | query_cache_type | OFF | +------------------+-------+ 1 row in set (0.00 sec) 注意 MySQL 8.0版本直接将查询缓存的整块功能删掉了,即8.0开始彻底没有这个功能了。 分析器 分析器做什么? 词法分析 识别SQL语句各个字符串是什么、代表什么 语法分析 根据语法规则,判断SQL语句是否满足MySQL语法 如果语句不对,会报“You have an error in your SQL syntax”错误 mysql> elect * from t where ID=1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1 一般语法错误会提示第一个出现错误的位置,需要关注紧接“use near”的内容。 优化器 优化器做什么? 在表里面有多个索引的时候,决定使用哪个索引 或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序 比如执行下面这样的语句,这个语句是执行两个表的join: mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 两种执行方法 先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20 先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10 这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。 执行器 分析器:要做什么优化器:怎么做 执行步骤 鉴权 没有:返回无权限错误 有:继续 打开表执行 打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。 有索引查询 第一次调用的是“取满足条件的第一行”这个接口 之后循环调用“满足条件的下一行”这个接口 无索引查询 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10 如果不是则跳过 如果是则将这行存在结果集中 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端 扫描了多少行? 数据库慢查询日志中有一个rows_examined字段,表示这个语句执行过程中扫描了多少行 这个值就是在执行器每次调用引擎获取数据行的时候累加的 存储引擎层 存储引擎层负责数据的存储和提取 架构模式是插件式的,支持InnoDB、MyISAM、Memory 等多个存储引擎 目前最常用的存储引擎是InnoDB,它从MySQL 5.5.5 版本开始成为了默认存储引擎 比如,执行create table建表时, 如果不指定引擎类型,默认使用的就是 InnoDB 使用engine=memory 来指定内存引擎创建表

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

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文件系统,支持十年生命周期更新。

用户登录
用户注册