1.zybo cluster 架构简述:

1.1 zybo cluster 包含5块zybo 开发板组成一个集群,zybo的boot文件为digilent zybo reference design提供的启动文件,文件系统采用arm ubuntu。ip地址自上而下为192.168.1.1~5,hostname自上而下为spark1~5,另外由于sdka写入速度为2.3Mps,因而每个zybo卡另外配置一个Sandisk Cruzer Blade 32GB 作为usb拓展存储设备,写速度为4Mps,运行的程序和jdk都放在u盘中,且每个节点都在u盘中设立一个2GB大小的swap文件作为交换区空间,以加速集群。所有节点都连接到一个千兆交换机上。性质为纯ARM计算集群。

1.2 就hadoop来说,版本为2.4.0,官方可执行包。spark1运行namenode,也同时作为datanode,而spark2~4只作为datanode,由于U盘容量有限,5个节点capacity约150G。hadoop配置了对tachyon的支持(增加dependence的jre库)。

1.3 就tachyon来说,spark1节点作为master,其他4个节点作为slave,每个slave节点的ramdisk缓冲区为1G,underlayer filesystem为hadoop。tachyon的主要作用是作为数据缓冲层,减少直接读取hadoop的网络开销,从而提高大数据计算的速度。

1.4 就spark来说,spark1节点只作为spark master,而其余4个节点则作为counter slaves。spark配置了对tachyon的支持(增加dependence的jre库),增加了对tachyon master节点ip的环境变量。

 

2.打开集群测试操作

2.1将5个zybo都上电,它们将自动配置mac地址及ip地址,用串口登录spark1节点,cd到root目录,执行如下命令:

./gohadoop.sh

./gotachyon.sh

./gospark.sh

2.2如要运行多个tachyon,并避免多个tachyon master之间的竞争,配置容错集群,运行以下命令开启zookeeper。

./gozookeeper.sh

2.3当提示启动成功,前往spark 的安装目录运行以下命令开启python命令行。

MASTER=spark://192.168.1.1:7077 ./bin/pyspark

2.4若开启期间出错,可使用以下命令停止所有spark节点并重新启动:

./sbin/stop-all.sh

SPARK_MASTER_IP=192.168.1.1 ./sbin/start-all.sh

测试脚本见5.spark测试一节。

 

3.Hadoop 测试:

3.1开启hadoop demo命令:

cd /mnt/hadoop-2.4.0/
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
sbin/hadoop-daemon.sh start secondarynamenode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver

3.2正常启动hadoop所有节点命令:

cd /mnt/hadoop-2.4.0/
sbin/start-dfs.sh
sbin/start-yarn.sh

3.3用jps观察目前运行的java进程:

jps -l | sort -k 2

3.4用netstat命令来监测端口开启情况,hadoop namenode默认端口9000,可以观察网页http://192.168.1.1:9000

while [ `netstat -ntlp | grep 9000` -eq `echo` ]
do
sleep 1
done
netstat -ntlp | grep 9000

3.5等待datanode都启动完毕后,查看hdfs中的目录:

bin/hadoop dfs -ls /

3.6从本地拷贝/mnt/in文件夹进入hdfs中成为/in的命令:

bin/hadoop dfs -copyFromLocal /mnt/in /in

3.7如何利用hadoop计算wordcount(hadoop目录 /in下拥有需要计算的文件,/out为输出目录:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar wordcount /in /out

3.8读取hadoop中计算好wordcount生成的文件

bin/hadoop fs -ls /out

bin/hadoop dfs -cat /out/part-r-00000

3.9如果要向hadoop集群加入新节点,需要格式化hadoop的namenode,同时所有的datanode也将被格式化:

rm -rf /mnt/namenode
rm -rf /mnt/datanode
rm -rf /mnt/hadoop/tmp/*

并且应该在所有的spark2~4执行以下命令,以去除存储的namenodeID和datanodeID。

rm -rf /mnt/datanode

然后执行format命令格式化namenode:

cd /mnt/hadoop-2.4.0/
bin/hadoop namenode -format
bin/hadoop datanode -format

最后,启动hadoop。

3.10停止hadoop(demo,单机):

sbin/hadoop-daemon.sh stop namenode

sbin/hadoop-daemon.sh stop datanode

sbin/hadoop-daemon.sh stop secondarynamenode

sbin/yarn-daemon.sh stop resourcemanager

sbin/yarn-daemon.sh stop nodemanager

sbin/mr-jobhistory-daemon.sh stop historyserver

3.11停止hadoop(集群):

。。。

 

4.Tachyon测试:

4.1首先,格式化tachyon缓冲层,然后启动所有节点,并把ramdisk进行mount操作:

cd /mnt/tachyon-0.4.1

./bin/tachyon format
./bin/tachyon-stop.sh
./bin/tachyon-start.sh all Mount

4.2等待tachyon的master和slave就绪,也可以访问http://192.168.1.1:19999确定所有节点启动。

while [ `netstat -ntlp | grep 19998` -eq `echo` ]
do
sleep 1
done

jps -l | sort -k 2

4.3 加载under file system到tachyon,让tachyon明白hadoop中已有的目录和其中的所有文件信息,如果不执行此命令,可能会遇到Unknown under file system scheme 错误java.lang.IllegalArgumentException.

./bin/tachyon loadufs tachyon://192.168.1.1:19998 hdfs://192.168.1.1:9000 /

4.4测试tachyon:

简单测试:

./bin/tachyon runTest Basic CACHE_THROUGH

全面测试:

./bin/tachyon runTests

4.5用tachyon层+hadoop测试wordcount,在hadoop安装目录运行以下行:

./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar \
wordcount -libjars /root/tachyon-0.4.1/target/tachyon-0.4.1-jar-with-dependencies.jar \
tachyon://192.168.1.1:19998/in/file /out/file

4.6 关闭tachyon

./bin/tachyon-stop.sh

 

5.Spark测试:

5.1启动spark集群

cd /mnt/spark-0.9.1-bin-hadoop2

SPARK_MASTER_IP=192.168.1.1 ./sbin/start-all.sh

5.2检查启动状况,使用如下命令,或查看网页http://192.168.1.1:8080

jps -l | sort -k 2

echo "please wait..."

while [ `netstat -ntlp | grep 7077` -eq `echo` ]

do

sleep 1

done

netstat -ntlp | grep 7077

5.3开启python spark 命令行:

cd /mnt/spark-0.9.1-bin-hadoop2

MASTER=spark://192.168.1.1:7077 ./bin/pyspark

5.4pi测试脚本(1000为number of samples采样个数):

from random import random
def sample(p):
x, y = random(), random()
return 1 if x*x + y*y < 1 else 0 count = sc.parallelize(xrange(0, 1000)).map(sample) \
.reduce(lambda a, b: a + b)
print "Pi is roughly %f" % (4.0 * count / 1000)

5.5 wordcount的hadoop版:

SPARK_MASTER_IP=192.168.1.1 ./sbin/start-all.sh
MASTER=spark://192.168.1.1:7077 ./bin/pyspark
file = sc.textFile("hdfs://192.168.1.1:9000/test/file1M")
file = sc.textFile("hdfs://192.168.1.1:9000/test/file10M")
file = sc.textFile("hdfs://192.168.1.1:9000/test/file100M")
file = sc.textFile("hdfs://192.168.1.1:9000/test/file1G")
file = sc.textFile("hdfs://192.168.1.1:9000/test/file10G")
file = sc.textFile("hdfs://192.168.1.1:9000/test/file100G")
counts = file.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a + b)
counts.collect()
counts.saveAsTextFile("hdfs://192.168.1.1:9000/out/outfile")

5.6workcount的tachyon版:

SPARK_MASTER_IP=192.168.1.1 ./sbin/start-all.sh
MASTER=spark://192.168.1.1:7077 ./bin/pyspark
file = sc.textFile("tachyon://192.168.1.1:19998/test/file1M")
file = sc.textFile("tachyon://192.168.1.1:19998/test/file10M")
file = sc.textFile("tachyon://192.168.1.1:19998/test/file100M")
file = sc.textFile("tachyon://192.168.1.1:19998/test/file1G")
file = sc.textFile("tachyon://192.168.1.1:19998/test/file10G")
file = sc.textFile("tachyon://192.168.1.1:19998/test/file100G")
counts = file.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a + b)
counts.collect()
counts.saveAsTextFile("tachyon://192.168.1.1:19998/out/outfile")

其他测试请参考reference.5

5.7关闭spark:

./sbin/stop-all.sh

 

6.节点通用配置

6.1配置计算机名(如第二个节点就配置成spark2)。

vi /etc/hostname

spark2

6.2配置本地网络节点信息配置文件(以spark1为例)。

vi /etc/hosts

#127.0.0.1      localhost       zynq

192.168.1.1     spark1          localhost

192.168.1.2     spark2

192.168.1.3     spark3

192.168.1.4     spark4

192.168.1.5     spark5

#::1            localhost ip6-localhost ip6-loopback

6.3配置ipv6为disable(reboot生效):

vi /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1

6.4路径环境变量及启动加载配置(以spark1节点为例):

vi /etc/profile

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH

export JAVA_HOME=/mnt/jdk1.7.0_55

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar

export PATH=$JAVA_HOME/bin:$PATH

export HADOOP_HOME=/mnt/hadoop-2.4.0

export PATH=$PATH:$HADOOP_HOME/bin

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

ifconfig eth2 hw ether 00:0a:35:00:01:01

ifconfig eth2 192.168.1.1/24 up

6.5ssh配置:

生成公匙 id_rsa.pub 配置文件(一路回车):

ssh-keygen -t rsa

把localhost加入签名:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

分发公钥:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@spark1

ssh-copy-id -i ~/.ssh/id_rsa.pub root@spark2

ssh-copy-id -i ~/.ssh/id_rsa.pub root@spark3

ssh-copy-id -i ~/.ssh/id_rsa.pub root@spark4

ssh-copy-id -i ~/.ssh/id_rsa.pub root@spark5

6.6配置java

cd /usr/bin/

ln -s /usr/lib/jdk1.7.0_55/bin/java java

ln -s /usr/lib/jdk1.7.0_55/bin/javac javac

ln -s /usr/lib/jdk1.7.0_55/bin/jar jar

6.7配置swap

打印当前内存空间情况:

free -m

创建一个swap文件:

cd /mnt

mkdir swap

cd swap/

dd if=/dev/zero of=swapfile bs=1024 count=1000000

把生成的文件转换成swap文件 :

mkswap swapfile

激活swap文件 :

swapon swapfile

free -m

 

7.Hadoop配置

cd /mnt/hadoop-2.4.0

7.1配置hadoop运行环境:

vi etc/hadoop/hadoop-env.sh

export JAVA_HOME=/mnt/jdk1.7.0_55

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/mnt/tachyon-0.4.1/target/tachyon-0.1-jar-with-dependencies.jar

7.2配置yarn-site

vi etc/hadoop/yarn-site.xml

<configuration>

  <property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

  </property>

  <property>

    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>

    <value>org.apache.hadoop.mapred.ShuffleHandler</value>

  </property>

</configuration>

7.3配置core-site

首先建立:/mnt/hadoop/tmp目录

vi etc/hadoop/core-site.xml

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://192.168.1.1:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/mnt/hadoop/tmp</value>

    </property>

    <property>

        <name>fs.tachyon.impl</name>

        <value>tachyon.hadoop.TFS</value>

    </property>

</configuration>

7.4配置hdfs-site

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>1</value>

    </property>

    <property>

        <name>dfs.permissions</name>

        <value>false</value>

    </property>

    <property>

        <name>dfs.namenode.rpc-address</name>

        <value>192.168.1.1:9000</value>

    </property>

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>file:/mnt/datanode</value>

    </property>

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>file:/mnt/namenode</value>

    </property>

</configuration>

7.5配置mapred-site

vi etc/hadoop/mapred-site.xml

<configuration>

    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

</configuration>

7.6master配置为192.168.1.1,slave配置成5个节点的ip地址即可

 

8.Tachyon配置

cd /mnt/tachyon-0.4.1

8.1配置tachyon环境:

vi conf/tachyon-env.sh

if [[ `uname -a` == Darwin* ]]; then

  # Assuming Mac OS X

  export JAVA_HOME=$(/usr/libexec/java_home)

  export TACHYON_RAM_FOLDER=/Volumes/ramdisk

  export TACHYON_JAVA_OPTS="-Djava.security.krb5.realm= -Djava.security.krb5.k="

else

  # Assuming Linux

  if [ -z "$JAVA_HOME" ]; then

    export JAVA_HOME=/mnt/jdk1.7.0_55

  fi

  export TACHYON_RAM_FOLDER=/mnt/ramdisk

fi

export JAVA="$JAVA_HOME/bin/java"

export TACHYON_MASTER_ADDRESS=192.168.1.1

#export TACHYON_UNDERFS_ADDRESS=/mnt/underfs

#export TACHYON_UNDERFS_ADDRESS=/mnt/underfs

export TACHYON_UNDERFS_ADDRESS=hdfs://192.168.1.1:9000

export TACHYON_WORKER_MEMORY_SIZE=1GB

export TACHYON_UNDERFS_HDFS_IMPL=org.apache.hadoop.hdfs.DistributedFileSystem

CONF_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

export TACHYON_JAVA_OPTS+="

  -Dlog4j.configuration=file:$CONF_DIR/log4j.properties

  -Dtachyon.debug=false

  -Dtachyon.underfs.address=$TACHYON_UNDERFS_ADDRESS

  -Dtachyon.underfs.hdfs.impl=$TACHYON_UNDERFS_HDFS_IMPL

  -Dtachyon.data.folder=$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/data

  -Dtachyon.workers.folder=$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/workers

  -Dtachyon.worker.memory.size=$TACHYON_WORKER_MEMORY_SIZE

  -Dtachyon.worker.data.folder=$TACHYON_RAM_FOLDER/tachyonworker/

  -Dtachyon.master.worker.timeout.ms=60000

  -Dtachyon.master.hostname=$TACHYON_MASTER_ADDRESS

  -Dtachyon.master.journal.folder=/mnt/journal/

  -Dtachyon.master.pinlist=/pinfiles;/pindata

  -Dorg.apache.jasper.compiler.disablejsr199=true

"

8.2若使用zookeeper,的配置如下:

if [[ `uname -a` == Darwin* ]]; then

  # Assuming Mac OS X

  export JAVA_HOME=$(/usr/libexec/java_home)

  export TACHYON_RAM_FOLDER=/Volumes/ramdisk

  export TACHYON_JAVA_OPTS="-Djava.security.krb5.realm= -Djava.security.krb5.k="

else

  # Assuming Linux

  if [ -z "$JAVA_HOME" ]; then

    export JAVA_HOME=/usr/lib/jdk1.7.0_55

  fi

  export TACHYON_RAM_FOLDER=/mnt/ramdisk

fi

export JAVA="$JAVA_HOME/bin/java"

export TACHYON_MASTER_ADDRESS=192.168.1.1

#export TACHYON_UNDERFS_ADDRESS=$TACHYON_HOME/underfs

#export TACHYON_UNDERFS_ADDRESS=/mnt/underfs

export TACHYON_UNDERFS_ADDRESS=hdfs://192.168.1.1:9000

export TACHYON_WORKER_MEMORY_SIZE=1GB

export TACHYON_UNDERFS_HDFS_IMPL=org.apache.hadoop.hdfs.DistributedFileSystem

#export TACHYON_UNDERFS_HDFS_IMPL=fs.defaultFS

export TACHYON_ZOOKEEPER_ADDRESS=192.168.1.1:2181

CONF_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

export TACHYON_JAVA_OPTS+="

  -Dlog4j.configuration=file:$CONF_DIR/log4j.properties

  -Dtachyon.debug=false

  -Dtachyon.underfs.address=$TACHYON_UNDERFS_ADDRESS

  -Dtachyon.usezookeeper=true

  -Dtachyon.zookeeper.address=$TACHYON_ZOOKEEPER_ADDRESS

  -Dtachyon.underfs.hdfs.impl=$TACHYON_UNDERFS_HDFS_IMPL

  -Dtachyon.data.folder=$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/data

  -Dtachyon.workers.folder=$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/workers

  -Dtachyon.worker.memory.size=$TACHYON_WORKER_MEMORY_SIZE

  -Dtachyon.worker.data.folder=$TACHYON_RAM_FOLDER/tachyonworker/

  -Dtachyon.master.worker.timeout.ms=60000

  -Dtachyon.master.hostname=$TACHYON_MASTER_ADDRESS

  -Dtachyon.master.journal.folder=hdfs://192.168.1.1:9000/tachyon/journal/

  -Dtachyon.master.pinlist=/pinfiles;/pindata

  -Dorg.apache.jasper.compiler.disablejsr199=true

"

8.3.配置slaves为192.168.1.2~5

9. Spark配置

cd /mnt/spark-0.9.1-bin-hadoop2/

9.1配置core-site

vi conf/core-site.xml

<configuration>

  <property>

    <name>fs.tachyon.impl</name>

    <value>tachyon.hadoop.TFS</value>

  </property>

</configuration>

9.2配置core-site

vi conf/spark-env.sh

JAVA_HOME=/mnt/jdk1.7.0_55

SPARK_MASTER_IP=192.168.1.1

SPARK_CLASSPATH=/mnt/tachyon-0.4.1/target/tachyon-0.4.1-jar-with-dependencies.r:$SPARK_CLASSPATH

export SPARK_CLASSPATH

9.3配置slaves为192.168.1.2~5

10.配置zookeeper:

cd /mnt/zookeeper-3.3.6

vi conf/zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/mnt/zookeeper

# the port at which the clients will connect

clientPort=2181

#server.1=192.168.1.1:2888:3888

#server.2=192.168.1.2:2888:3888

 

11.问题

(hadoop节点识别机制):当需要向集群中加入一个新的datanode节点时,我们会复制当前的一个节点的sd卡到新的节点中,这会造成hadoop的datanode监控页面中这个被复制节点和新节点竞争的局面,因为hadoop不是根据ip,mac或者机器名来识别一个节点。相反,namespaceID是hadoop集群的唯一标识符,namenode通过此ID来识别自己集群中的datanode。

参考:http://blog.csdn.net/xiaojiafei/article/details/10152395

解决:清空新节点的etc/hadoop/hdfs-site.xml中定义的namenode文件夹。

 

12. reference:

1.Digilent zybo Ref Design

http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,1198&Prod=ZYBO

2.Oracle JDK7 for ARM

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-arm-downloads-2187468.html

3.What is hadoop:

http://hadoop.apache.org/

4.What is spark:

http://spark.apache.org/

5.Spark example code:

http://spark.apache.org/examples.html

6.What is hdfs:

http://hadoop.apache.org/docs/r1.2.1/hdfs_design.html

7.What is tachyon:

http://tachyon-project.org/

8.Tachyon github:

https://github.com/amplab/tachyon/releases

9.What is Zoo Keeper:

http://zookeeper.apache.org/

hadoop+tachyon+spark的zybo cluster集群综合配置的更多相关文章

  1. redis cluster 集群 安装 配置 详解

    redis cluster 集群 安装 配置 详解 张映 发表于 2015-05-01 分类目录: nosql 标签:cluster, redis, 安装, 配置, 集群 Redis 集群是一个提供在 ...

  2. hadoop+yarn+hbase+storm+kafka+spark+zookeeper)高可用集群详细配置

    配置 hadoop+yarn+hbase+storm+kafka+spark+zookeeper 高可用集群,同时安装相关组建:JDK,MySQL,Hive,Flume 文章目录 环境介绍 节点介绍 ...

  3. Redis3.0.7 cluster/集群 安装配置教程

    1.前言 环境:CentOS-6.7-i386-LiveDVD 安装的CentOs系统 节点: 6个节点,3个主节点.3个从节点(由于redis默认需要3个主节点,如果想每个主节点有一个从节点,这是最 ...

  4. Innodb Cluster集群部署配置

    目录 一.简介 二.环境声明 三.部署 安装(均操作) 配置(均操作) 开启group_replication(均操作) 启动group_replication 创建集群(在mysql-1执行) 创建 ...

  5. 深入分析redis cluster 集群

    深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...

  6. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

  7. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  8. 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

    Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...

  9. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

随机推荐

  1. WPF 画心2.0版之元旦快乐

    2017年元旦已经到了,想做一个祝福语的窗口,就把上一篇画心的程序改了改,变成了如下界面. 说下改动的地方,首先窗口没有标题栏了. MainWindow.xaml AllowsTransparency ...

  2. Navicat Premium连接Oracle 问题汇总

  3. php 封装 知识点

    类由众多对象抽象出来的对象由类实例化出来的 成员变量成员方法成员属性 访问修饰符public 公有的protected 受保护的private 私有的 构造函数1.写法特殊2.执行时间特殊 面向对象的 ...

  4. swift之inout

    在swift中,我们常常对数据进行一些处理.因为swift的计算属性,所以如果不是大量重复性处理,基本可以在set及didSet中改变原数据的一些状态.但需要用到同样的算法处理大量数据的时候,仍然需要 ...

  5. js实现返回顶部功能的解决方案

    很多网站上都有返回顶部的效果,主要有如下几种解决方案. 1.纯js,无动画版本 window.scrollTo(x-coord, y-coord); window.scrollTo(0,0); 2.纯 ...

  6. Python 学习拾遗

    该博文主要适应于python2.7,并没有对py3进行测试. 主要记录学习python过程中容易出现的一些小问题.小错误,相信能给你启发. 1.剔除一个字符串中的所有空格(假设该字符串是s) &quo ...

  7. [BI项目记]-新任务处理

    上一篇主要介绍如何借助TFS创建一个新的工作项,此篇主要演示如何对其进行处理. 首先回顾下新工作项不同阶段的定义. 接下来进入到开发阶段,根据需求创建五个报表.打开SQL Server Data To ...

  8. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  9. Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件

    引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...

  10. Cucumber(一): Preparation

    Every time I wrote some code in ruby and executed our cucumber features I craved for something simil ...