mongodb-scala-driver 3.4.0怎么设置打印日志

mongodb-scala-driver 3.4.0怎么设置打印日志,第1张

在使用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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9324634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存