在使用hiberate实现数据层时,总会打开hibernateshow_sql=true选项,显示hibernate生成的SQL语句。他们可以通过生成的SQL语句了解ORM使用和运行,并可以依据SQL语句优化程序。同理我们也希望在mongo java driver中看见生成 *** 作数据库语句日志。
直接使用mongo driver
在mongo driver加载之前设置如下系统属性:
[java] view plain copy print
// Enable MongoDB logging in general
SystemsetProperty("DEBUGMONGO", "true");
// Enable DB operation tracing
SystemsetProperty("DBTRACE", "true");
使用spring
spring使用了依赖注入,mongo driver加载由spring完成,所以也使用注入方法设置系统属性,设置方法如下:
[html] view plain copy print
<bean id="sysProps"
class="orgspringframeworkbeansfactoryconfigMethodInvokingFactoryBean">
<property name="targetClass" value="javalangSystem" />
<property name="targetMethod" value="getProperties" />
</bean>
<bean id="sysMongo"
class="orgspringframeworkbeansfactoryconfigMethodInvokingFactoryBean">
<property name="targetObject" ref="sysProps"/>
<property name="targetMethod" value="setProperty"/>
<property name="arguments">
<list>
<value>DEBUGMONGO</value>
<value>true</value>
</list>
</property>
</bean>
<bean id="sysDbTrace"
class="orgspringframeworkbeansfactoryconfigMethodInvokingFactoryBean">
<property name="targetObject" ref="sysProps"/>
<property name="targetMethod" value="setProperty"/>
<property name="arguments">
<list>
<value>DBTRACE</value>
<value>true</value>
</list>
</property>
</bean>
<mongo:mongo host="localhost" port="27017">
<mongo:options connections-per-host="8"
threads-allowed-to-block-for-connection-multiplier="4"
connect-timeout="1000" max-wait-time="1500" auto-connect-retry="true"
socket-keep-alive="true" socket-timeout="1500" slave-ok="true"
write-number="1" write-timeout="0" write-fsync="false" />
</mongo:mongo>
<mongo:db-factory dbname="ewcms" mongo-ref="mongo" />
日志效果
信息: localhost:27017
三月 30, 2012 3:31:46 下午 commongodbDBApiLayer trace
信息: find: ewcmssystemindexes { "name" : "name" , "ns" : "ewcmsperson" , "dropDups" : false , "sparse" : false , "unique" : false , "key" : { "name" : 1}}
三月 30, 2012 3:31:46 下午 commongodbDBApiLayer trace
信息: save: ewcmssystemindexes { "name" : "name" , "ns" : "ewcmsperson" , "dropDups" : false , "sparse" : false , "unique" : false , "key" : { "name" : 1}}
三月 30, 2012 3:31:46 下午 commongodbDBApiLayer trace
信息: find: ewcmssystemindexes { "name" : "cerId" , "ns" : "ewcmscertificate" , "dropDups" : false , "sparse" : false , "unique" : true , "key" : { "cerId" : 1}}
三月 30, 2012 3:31:46 下午 commongodbDBApiLayer trace
信息: find: ewcmssystemnamespaces { }
三月 30, 2012 3:31:46 下午 commongodbDBApiLayer trace
信息: find: ewcmscertificate { "brithdate" : { "$gt" : { "$date" : "1976-12-22T16:00:00000Z"} , "$lt" : { "$date" : "1976-12-24T16:00:00000Z"}}}
Spark的安装模式一般分为三种:1伪分布模式:即在一个节点上模拟一个分布式环境,master和worker共用一个节点,这种模式一般用于开发和测试Spark程序;2全分布模式:即真正的集群模式,master和worker部署在不同的节点之上,一般至少需要3个节点(1个master和2个worker),这种模式一般用于实际的生产环境;3HA集群模式:即高可用集群模式,一般至少需要4台机器(1个主master,1个备master,2个worker),这种模式的优点是在主master宕机之后,备master会立即启动担任master的职责,可以保证集群高效稳定的运行,这种模式就是实际生产环境中多采用的模式。本小节来介绍Spark的全分布模式的安装和配置。
安装介质:
jdk-8u162-linux-x64targz 提取码:2bh8
hadoop-273targz 提取码:d4g2
scala-2126tgz 提取码:s2ly
spark-210-bin-hadoop27tgz 提取码:5kcf
准备3台Linux主机,按照下面的步骤在每台主机上执行一遍,设置成如下结果:
安装Linux *** 作系统比较简单,这里不再详细。参考:《 Linux从入门到精通1:使用 VMware Workstation 14 Pro 安装 CentOS 7 详细图文教程 》
编辑hosts配置文件:# vi /etc/hosts,追加3行:
测试主机名是否可用:
(1)使用ssh-keygen工具生成秘钥对:
(2)将生成的公钥发给三台主机:master、slave1、slave2:
(3)测试秘钥认证是否成功:
由于各个主机上的时间可能不一致,会导致执行Spark程序出现异常,因此需要同步各个主机的时间。在实际生成环境中,一般使用时间服务器来同步时间,但是搭建时间服务器相对较为复杂。这里介绍一种简单的方法来快速同步每台主机主机的时间。我们知道,使用date命令可以设置主机的时间,因此这里使用putty的插件MTPuTTY来同时向每一台主机发送date命令,以到达同步时间的目的。
(1)使用MTPuTTY工具连接三台主机,点击MTPuTTY工具的Tools菜单下的“Send script…”子菜单,打开发送脚本工具窗口。
(2)输入命令:date -s 2018-05-28,然后回车(注意:一定要回车,否则只发送不执行),在下面服务器列表中选择要同步的主机,然后点击“Send script”,即可将时间同步为2018-05-28 00:00:00。
使用winscp工具将JDK安装包 jdk-8u144-linux-x64targz 上传到/root/tools/目录中,该目录是事先创建的。
进入/root/tools/目录,将jdk安装包解压到/root/training/目录中,该目录也是事先创建的。
使用winscp工具将Hadoop安装包 hadoop-273targz 上传到master节点的/root/tools/目录中,该目录是事先创建的。
进入/root/tools/目录,将hadoop安装包解压到/root/training/目录中,该目录也是事先创建的。
进入Hadoop配置文件目录:
(1) 配置hadoop-envsh文件:
(2) 配置hdfs-sitexml文件:
(3) 配置core-sitexml文件:
(4) 配置mapred-sitexml文件:
将模板文件mapred-sitexmltemplate拷贝一份重命名为mapred-sitexml然后编辑:
(5) 配置yarn-sitexml文件:
(6) 配置slaves文件:
将master上配置好的Hadoop安装目录分别复制给两个从节点slave1和slave2,并验证是否成功。
第一次启动需要输入yes继续。
启动成功后,使用jps命令查看各个节点上开启的进程:
使用命令行查看HDFS的状态:
使用浏览器查看HDFS的状态:
使用浏览器查看YARN的状态:
(1) 在HDFS上创建输入目录/input:
(2) 将本地数据文件datatxt上传至该目录:
(3) 进入到Hadoop的示例程序目录:
(4) 执行示例程序中的Wordcount程序,以HDFS上的/input/datatxt作为输入数据,输出结果存放到HDFS上的/out/wc目录下:
(5) 查看进度和结果:
可以通过终端打印出来的日志信息知道执行进度:
执行结束后可以在HDFS上的/out/wc目录下查看是否有_SUCCESS标志文件来判断是否执行成功。
如果执行成功,可以在输出目录下看到_SUCCESS标志文件,且可以在part-r-00000文件中查看到wordcount程序的结果:
由于Scala只是一个应用软件,只需要安装在master节点即可。
使用winscp工具将Scala安装包上传到master节点的/root/tools目录下:
进入/root/tools目录,将Scala安装包解压到安装目录/root/training/:
将Scala的家目录加入到环境变量PATH中:
使环境变量生效:
输入scala命令,如下进入scala环境,则证明scala安装成功:
我们先在master节点上配置好参数,再分发给两个从节点slave1和slave2。
使用winscp工具将Spark安装包上传到master节点的/root/tools目录下:
进入/root/tools目录,将Spark安装包解压到安装目录/root/training/下:
注意:由于Spark的命令脚本和Hadoop的命令脚本有冲突(比如都有start-allsh和stop-allsh等),
所以这里需要注释掉Hadoop的环境变量,添加Spark的环境变量:
按Esc:wq保存退出,使用source命令使配置文件立即生效:
进入Spark的配置文件目录下:
(1) 配置spark-envsh文件:
(2) 配置slaves文件:
将master上配置好的Spark安装目录分别复制给两个从节点slave1和slave2,并验证是否成功。
启动后查看每个节点上的进程:
使用浏览器监控Spark的状态:
使用spark-shell命令进入SparkContext(即Scala环境):
启动了spark-shell之后,可以使用4040端口访问其Web控制台页面(注意:如果一台机器上启动了多个spark-shell,即运行了多个SparkContext,那么端口会自动连续递增,如4041,4042,4043等等):
注意:由于我们将Hadoop从环境变量中注释掉了,这时只能手动进入到Hadoop的sbin目录停止Hadoop:
Spark中常用的端口总结:
你是说Scala的type system么?老实说我也没有完全弄懂,更多的时候看看语言参考可能更好。不过就常用的几点可以大致说明下。
1 Java Array & Scala List
用过Java Array的人应该都知道,Java里面有个著名的问题。
String[] strings = {"foo", "bar"};
Object[] objects = strings;
objects[0] = 1; // ArrayStoreException here
编译器无法发现这个类型安全问题。当然这不能完全说是Java的缺陷,因为Java5之前貌似不想写那么多sort(int[] array); sort(float[] array);的话貌似也只能这么干。
这里要引出的是Scala相比引入了协变(covariant)概念。
不可变集合是可协变的,比如List[String] => List[Any]
val strings = List("foo", "bar") // immutable
val objects: List[Any] = strings // OK
可变集合是不可协变的,ListBuffer[String] 不可变成 ListBuffer[Any]
import scalacollectionmutable
val strings = mutableListBuffer("foo", "bar")
val objects: mutableListBuffer[Any] = strings
/
found : scalacollectionmutableListBuffer[String]
required: scalacollectionmutableListBuffer[Any]
Note: String <: Any, but class ListBuffer is invariant in type A
You may wish to investigate a wildcard type such as `_ <: Any` (SLS 3210)
val objects: mutableListBuffer[Any] = strings
/
事实上这样就避免的Java那个问题。
当然如果你要排序的话该怎么办?
def quickSort[A](array: Array[A])(implicit ord: Ordering[A]): Unit = ()
def quickSort[A](list: List[A])(implicit ord: Ordering[A]): List[A] = list
直接用Scala现成的Array[A]和List[A]就行了。
2 Manifest
针对类型擦除的问题,简单来说就是Java和Scala互相调用。直接用Twitter的Scala School上一段例子。
class MakeFoo[A](implicit manifest: Manifest[A]) { def make: A = manifesterasurenewInstanceasInstanceOf[A] }
(new MakeFoo[String])make // return a string ""
3 Pattern Match
在Java中检查类型是很无趣的一件事情,先要isInstanceOf,然后再强制转换,有时候还要SuppressWarning。但是在Scala中,语法层面帮你完成了这个 *** 作。
def contains(x: Int): Boolean = this match {
case Leaf(y) => x == y
case Node(left, right) => leftcontains(x) || rightcontains(x)
}
4 类设计
这可能是一个偏实际的问题,而且并不是说Java下一定没有约束方法。
考虑你设计一个汇率了,必须满足美元只能和美元相加。Scala下你可以这么做
sealed abstract class AbstractCurrency {
type Currency <: AbstractCurrency
def add(that: Currency): Currency
}
class Dollar extends AbstractCurrency {
type Currency = Dollar
def add(that: Dollar): Dollar = { / / }
}
Java下该怎么做呢?熟练的人很快就能想到用接口(抽象类,我又想到Scala下self自我表示语法了),但是无逻辑,很快你就能预见你会增加CurrencyFactory,类型判断等等。因为表达的问题,导致你为了满足约束条件而大量增加代码。有时你只要获取自己的类型判断一下就行,作为OOP你肯定不想那么干。当然大家都是过来人,不会因为这点而认为Java一点都没用,只是大家意识到了Java的OOP表达有限而已。
以上就是关于mongodb-scala-driver 3.4.0怎么设置打印日志全部的内容,包括:mongodb-scala-driver 3.4.0怎么设置打印日志、Spark从入门到精通3:Spark全分布模式的安装和配置、如何理解type-safe programming language等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)