Spark安装和使用

安装Spark

略,见参考资料。

用docker安装spark

docker hub上有不少spark镜像,例如p7hb/docker-spark,可以快速安装好。

docker pull p7hb/docker-spark
docker run -it -p 4040:4040 -p 8080:8080 -p 8081:8081 -h spark --name=spark p7hb/docker-spark:2.2.0

进入Spark-shell

$ spark2-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
17/04/18 13:08:38 WARN spark.SparkContext: Use an existing SparkContext, some configuration may not take effect.
Spark context Web UI available at http://10.1.235.9:4040
Spark context available as 'sc' (master = yarn, app id = application_1491024547163_1752).
Spark session available as 'spark'.
Welcome to
 ____ __
 / __/__ ___ _____/ /__
 _\ \/ _ \/ _ `/ __/ '_/
 /___/ .__/\_,_/_/ /_/\_\ version 2.0.0.cloudera1
 /_/
 
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_80)
Type in expressions to have them evaluated.
Type :help for more information.

scala>

在spark-shell里输入代码时,可以按tab键得到补全提示,很方便。

使用第三方jar包

主要通过下面这两个参数指定,注意两个参数中多个jar之间的分隔符是不一样的。

  • --jars driver和executor都需要的包,多个包之间用逗号(,)分割
  • --driver-class-path driver所依赖的包,多个包之间用冒号(:)分割

注:有一说是--jars里包含的包不需要在--driver-class-path里再次指定,但在spark2.0.0里发现仍然需要在--driver-class-path里指定。

使用java类/方法

scala> import java.lang.Double.isNaN
import java.lang.Double.isNaN

scala> isNaN(1) 
res57: Boolean = false

或直接使用全限定名:

scala> java.lang.Double.isNaN(1)
res58: Boolean = false

加载外部scala文件

事先写好一个test1.scala文件,然后在spark-shell里:

scala> :load test1.scala

注意load前面带一个冒号(:)

参考资料:

Spark On YARN 集群安装部署 (不错的安装教程,spark 1.3+hadoop 2.6)

Apache Spark技术实战之6 -- spark-submit常见问题及其解决

关于SSD磁盘的写入放大

SSD的写入性能与剩余空间有(很大)关系,原理是向SSD写入数据时不能直接覆盖,而是需要先把整个块(如512KB)的内容读出来(备份,因为这个块上还有其他不需要删除的数据),擦除这个块,再把需要写入的数据连通刚才备份出来的数据合并到一起写回去。

由于上面的操作,物理写的数据量(如512KB+512KB)通常大于逻辑上的数据量(如4KB),这个放大的倍数被称为写入放大倍数(WA,Write Amplification)

ssd_wa

一个日常感受到的例子,在一个将要满的磁盘上,删除30000个小文件,发现删除速度越来越快:

ssd_del_1
ssd_del_2
ssd_del_3

参考资料:

关于Kafka的ISR

ISR代表In-Sync Replicas,在Kafka里表示目前处于同步状态的那些副本(replica)。

Kafka规定一条消息只有当ISR中所有的副本都复制成功时,才能被消费。

例如下图中的情况,id为1的节点处于失效状态,相应的可以看到有些partition(例如partition1、partition2)的Isr只有一个,则这些partition里有些message在节点1里还没有复制成功,因此不能被消费。   -- 这段有问题

Leadership has switched to one of the slaves and node 1 is no longer in the in-sync replica set,But the messages are still available for consumption even though the leader that took the writes originally is down:

min.insync.replicas

kafka-isr-2

参考资料:

ZooKeeper基本操作

进入zookeeper命令行,zookeeper默认端口号是2181:

$ bin/zkCli.sh -server 127.0.0.1:2181

Zookeeper命令行下的操作和文件系统比较接近。例如可以对指定目录进行列表(注意目录名必须以/开头):

ls /

创建一个znode,同时为这个znode设置一个数据(my_data),一个znode只能有一个数据:

create /zk_test my_data

更改znode上的数据(会覆盖之前设置的数据):

set /zk_test my_data_2

读取znode上的数据:

get /zk_test

删除znode:

delete /zk_test

参考资料:

Zookeeper Getting Started Guide

AndroidStudio加速

从1.0到现在的2.2,AndroidStudio使用起来经常卡顿,特别在build的时候,经常CPU 100%需要等待很长时间,体验很不好。用以下方法可以缓解:

增加可用内存

修改studio64.exe.vmoptions这个文件(Help -> Edit Custom VM Options),内容:

-Xms2048m
-Xmx2048m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m

改完以后记得点一下File--Invalidate caches/restart这个,才能生效,不然关掉as再开就打不开了。(实测在2016.3社区版直接重启也能生效)

优化Gradle参数

在setting里搜索gradle,开启“offline”模式。

在setting里搜索compiler,开启“Compile independent modules in parallel”选项。

参考链接

Android Studio 使用起来很卡,你们是如何解决的?

Building and running app via Gradle and Android Studio is slower than via Eclipse

Solr若干注意事项

1、数据批量导入(DataImport)

判断数据重复的依据是schema.xml里的uniqueKey,即使多次重复导入,也不会产生重复的document:

<uniqueKey>c_id</uniqueKey>

2、更新schema

首先需要更新schema.xml和solrConfig.xml文件,比如增加一个field。注意在管理界面admin->core0->Overview里查看一下solr配置文件的位置(如Instance:/usr/share/solr/core0),要更新这个位置下的配置文件。

注意:需要重启solr才会生效,已经索引的document需要重新索引。

3、删除已经导入的数据

参考solr的wiki,在管理界面admin->core0->Documents里,用xml格式分别执行删除和确认命令:

<delete><query>*:*</query></delete>
<commit/>

4、导入大量数据

如果一次导入大量数据,有可能会导致内存不足而失败。解决的办法是分批导入,在管理界面里core0->Dataimport下指定Start,Rows即可。(特别是有sub-entity的情况)

注意1:不要勾选clean复选框,否则上次导入的数据将比清除。

注意2:Start,Rows不是Start,End

注意3:Start值很高的时候,即使rows不大,导入速度仍然会很慢。此时可以用debug模式修改query(例如加上where id> 1000000)。

5、在tomcat里指定solr.home

在server.xml里的<context>下指定<Enviroment>:

<Environment name="solr/home" type="java.lang.String" value="/usr/share/solr"/>

参考资料:

Solr FAQ

How to fix java RuntimeException: Can't find resource 'solrconfig.xml'?