1. 修改/etc/profile文件
如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。
·用文本编辑器打开/etc/profile
·在profile文件末尾加入:
[java]
JAVA_HOME=/usr/share/jdk1.5.0_05
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
[/java]
·重新登录
·注解
a. 你要将 /usr/share/jdk1.5.0_05jdk 改为你的jdk安装目录
b. linux下用冒号“:”来分隔路径
c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值
在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种
常见的错误。
d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。
e. export是把这三个变量导出为全局变量。
f. 大小写必须严格区分。
2. 修改.bashrc文件
这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了。
·用文本编辑器打开用户目录下的.bashrc文件
·在.bashrc文件末尾加入:
set JAVA_HOME=/usr/share/jdk1.5.0_05
export JAVA_HOME
set PATH=$JAVA_HOME/bin:$PATH
export PATH
set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CLASSPATH
·重新登录
3. 直接在shell下设置变量
不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。
只需在shell终端执行下列命令:
export JAVA_HOME=/usr/share/jdk1.5.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
除了官方的hadoop版本外,cloudera.com也发布自己的hadoop版本。据说yahoo 负责hadoop开发的某个哥们跳槽到cloudera.com(hugo告诉我的)。为此,我把hadoop从官方的hadoop-0.20.1换成cloudera.com的hadoop-0.20.1+152.tar.gz,再加上hive-0.4.0+14.
配置方法跟官方的版本一致,具体请参考前边的文章或者网上的文档。可以当我配置好以后,运行start-all.sh时,确出现如下的报错:
======================================================================+
| Error: JAVA_HOME is not set and Java could not be found |
+———————————————————————-+
| Please download the latest Sun JDK from the Sun Java web site |
| > http://java.sun.com/javase/downloads/ < |
| |
| Hadoop requires Java 1.6 or later. |
| NOTE: This script will find Sun Java whether you install using the |
| binary or the RPM based installer. |
+======================================================================+
明明在hadoop-env.sh设置好了,为了保险,又在/etc/profile设置了一遍。以hadoop用户登陆系统,在任意路径执行echo $JAVA_HOME ,显示"/usr/local/jdk",是我服务器jdk正确的路径啊!再查一下文档,云:需要jdk1.6以上的版本,我使用的是jdk1.6.0_16,应该符合要求的。
那问题又会在哪里呢?grep一把,看那些文件包含字符串JAVA_HOME.先搜hadoop/conf,只有hadoop-env.sh包含这个字串。再换一个目录hadoop/bin,查看一下,其输出如下:
[root@hadoops2 hadoop]# grep JAVA_HOME bin/*bin/hadoop:export JAVA_HOME=/usr/local/jdkbin/hadoop:# JAVA_HOME The java implementation to use. Overrides JAVA_HOME.
bin/hadoop:if [ "$JAVA_HOME" != "" ]; then
bin/hadoop: #echo "run java in $JAVA_HOME"
bin/hadoop: JAVA_HOME=$JAVA_HOME
bin/hadoop:if [ "$JAVA_HOME" = "" ]; then
bin/hadoop: echo "Error: JAVA_HOME is not set."
bin/hadoop:JAVA=$JAVA_HOME/bin/java
bin/hadoop:CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar
bin/hadoop-config.sh:if [ -z "$JAVA_HOME" ]; then
bin/hadoop-config.sh: export JAVA_HOME=$candidate
bin/hadoop-config.sh: if [ -z "$JAVA_HOME" ]; then
bin/hadoop-config.sh:| Error: JAVA_HOME is not set and Java could not be found |
bin/rcc:# JAVA_HOME The java implementation to use. Overrides JAVA_HOME.
bin/rcc:if [ "$JAVA_HOME" != "" ]; then
bin/rcc: #echo "run java in $JAVA_HOME"
bin/rcc: JAVA_HOME=$JAVA_HOME
bin/rcc:if [ "$JAVA_HOME" = "" ]; then
bin/rcc: echo "Error: JAVA_HOME is not set."
bin/rcc:JAVA=$JAVA_HOME/bin/java
bin/rcc:CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar
嘿!好几个文件都与JAVA_HOME相关呢。接着挨个查看文件,感觉hadoop-config.sh这个文件嫌疑最大,其内容刚好有一段与运行hadoop报错内容相一致,我把程序片段贴在下面:
# attempt to find java
if [ -z "$JAVA_HOME" ]; then
for candidate in \
/usr/lib/jvm/java-6-sun \
/usr/lib/j2sdk1.6-sun \
/usr/local/jdk \
/usr/java/jdk1.6* \
/usr/java/jre1.6* \
/Library/Java/Home ; do
if [ -e $candidate/bin/java ]; then
export JAVA_HOME=$candidate
break
fi
done
# if we didn't set it
if [ -z "$JAVA_HOME" ]; then
cat 1>&2 <
| Error: JAVA_HOME is not set and Java could not be found |
+----------------------------------------------------------------------+
| Please download the latest Sun JDK from the Sun Java web site |
| > http://java.sun.com/javase/downloads/ < |
| |
| Hadoop requires Java 1.6 or later. |
| NOTE: This script will find Sun Java whether you install using the |
| binary or the RPM based installer. |
+======================================================================+
EOF
exit 1
fi
fi
我在这段中间加如行 ” /usr/local/jdk \”,然后在运行,一切就正常了!
作者:田逸(sery@163.com) from http://blog.formyz.org/?p=140
在公司三年多了,要感谢的人很多
第一任主管,他给了我机会加入现在的团队!
一个兄弟,只相处三个月的兄弟,他给了我犯错的机会!
第二任主管一个影响着我们团队及我的大淫人,逐渐形成了一个open的团队,发掘了我身上open的特点!
一个合作的伙伴,大姐姐现在的boss,她一直关心着我,为我张罗女朋友!
还有我们的女王,一个小女人,背负着一条产品线的发展,从她身上我学到了以产品的角度看问题!
一直并肩作战一起进步的战友,兄弟,早婚男!
适时出现在身边的榜样,一起共事三年多的好兄弟,现在的主管!
未完待续。。。
1.直接在http://www.sphinxsearch.com/downloads.html找到最新的windows版本,我这里下的是 Win32 release binaries with MySQL support,下载后解压在D:\sphinx目录下;
2.在D:\sphinx\下新建一个data目录用来存放索引文件,一个log目录方日志文件,复制D:\sphinx\sphinx.conf.in到D:\sphinx\bin\sphinx.conf(注意修改文件名);
3.修改D:\sphinx\bin\sphinx.conf,我这里列出需要修改的几个:
type = mysql # 数据源,我这里是mysql
sql_host = localhost # 数据库服务器
sql_user = root # 数据库用户名
sql_pass = ” # 数据库密码
sql_db = test # 数据库
sql_port = 3306 # 数据库端口
sql_query_pre = SET NAMES utf8 # 去掉此行前面的注释,如果你的数据库是uft8编码的
index test1
{
# 放索引的目录
path = D:/sphinx/data/
# 编码
charset_type = utf-8
# 指定utf-8的编码表
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
# 简单分词,只支持0和1,如果要搜索中文,请指定为1
ngram_len = 1
# 需要分词的字符,如果要搜索中文,去掉前面的注释
ngram_chars = U+3000..U+2FA1F
}
# index test1stemmed : test1
# {
# path = @CONFDIR@/data/test1stemmed
# morphology = stem_en
# }
# 如果没有分布式索引,注释掉下面的内容
# index dist1
# {
# ‘distributed’ index type MUST be specified
# type = distributed
# local index to be searched
# there can be many local indexes configured
# local = test1
# local = test1stemmed
# remote agent
# multiple remote agents may be specified
# syntax is ‘hostname:port:index1,[index2[,...]]
# agent = localhost:3313:remote1
# agent = localhost:3314:remote2,remote3
# remote agent connection timeout, milliseconds
# optional, default is 1000 ms, ie. 1 sec
# agent_connect_timeout = 1000
# remote agent query timeout, milliseconds
# optional, default is 3000 ms, ie. 3 sec
# agent_query_timeout = 3000
# }
# 搜索服务需要修改的部分
searchd
{
# 日志
log = D:/sphinx/log/searchd.log
# PID file, searchd process ID file name
pid_file = D:/sphinx/log/searchd.pid
# windows下启动searchd服务一定要注释掉这个
# seamless_rotate = 1
}
4.导入测试数据
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uroot test 5.建立索引 D:\sphinx\bin>indexer.exe –all using config file ‘./sphinx.conf’… D:\sphinx\bin> 6.搜索’test’试试 D:\sphinx\bin>search.exe test using config file ‘./sphinx.conf’… displaying matches: words: 都所出来了吧。 6.测试中文搜索 修改test数据库中documents数据表, UPDATE `test`.`documents` SET `title` = ‘测试中文’, `content` = ‘this is my test document number two,应该搜的到吧’ WHERE `documents`.`id` = 2; 重建索引: D:\sphinx\bin>indexer.exe –all 搜索’中文’试试: D:\sphinx\bin>search.exe 中文 using config file ‘./sphinx.conf’… words: 貌似没有搜到,这是因为windows命令行中的编码是gbk,当然搜不出来。我们可以用程序试试,在D:\sphinx\api下新建一个foo.php的文件,注意utf-8编码
require ’sphinxapi.php’; 启动Sphinx searchd服务 D:\sphinx\bin>searchd.exe WARNING: forcing –console mode on Windows 执行PHP查询:
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
indexing index ‘test1′…
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.101 sec, 1916.30 bytes/sec, 39.72 docs/sec
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
index ‘test1′: query ‘test ‘: returned 3 matches of 3 total in 0.000 sec
1. document=1, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
id=1
group_id=1
group_id2=5
date_added=2008-11-26 14:58:59
title=test one
content=this is my test document number one. also checking search within
phrases.
2. document=2, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
id=2
group_id=1
group_id2=6
date_added=2008-11-26 14:58:59
title=test two
content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Wed Nov 26 14:58:59 2008
id=4
group_id=2
group_id2=8
date_added=2008-11-26 14:58:59
title=doc number four
content=this is to test groups
1. ‘test’: 3 documents, 5 hits
D:\sphinx\bin>
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
index ‘test1′: query ‘中文 ‘: returned 0 matches of 0 total in 0.000 sec
D:\sphinx\bin>
$s = new SphinxClient();
$s->SetServer(’localhost’,3312);
$result = $s->Query(’中文’);
var_dump($result);
?>
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file ‘./sphinx.conf’…
creating server socket on 0.0.0.0:3312
accepting connections
php d:/sphinx/api/foo.php
昨晚大家在说到spring配置文件中bean的id和name是纷纷表示出了迷惑。作为程序员有惑就得解惑,为此俺baidu了一把,google了一下找到相关同仁的文章,加上实践了一把,特在此涂鸦一把。
1、name与id之间的关系,name中文意思是名字,在这里就是一个bean定义的别名,默认等于id值。
2、id命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,”ab “等都是不规范的,Spring在初始化时就会报错,诸如:
org.xml.sax.SAXParseException: Attribute value ”?ab” of type ID must be a name.
3、name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如”a b”,” abc”,,这时,虽然初始化时不会报错,但在getBean()则会报出诸如以下的错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ’a b’ is defined
4、在spring同一个上下文中id,name只能有一个,但是同一个id可以用多个别名,比如<bean id=”a” name=”a1,a2,a3″ class=”com.shaxiaozi.A”/>,a1,a2,a3指向的是同一个对象[前提是单例的情况下]。如果不是单例则创建了和name数量相等的bean实体。
两个id相同的<bean>,否则在初始化时即会报错,如:
org.xml.sax.SAXParseException: Attribute value ”aa” of type ID must be unique within the document.
5、如果id和name都没有指定,则用类全名作为name,如<bean>,则你可以通过 getBean(“com.shaxiaozi.A”)返回该实例。
6、如果存在多个id和name都没有指定,且实例类都一样的<bean>,如:
<bean class=”com.stamen.BeanLifeCycleImpl”/>
<bean class=”com.stamen.BeanLifeCycleImpl”/>
<bean class=”com.stamen.BeanLifeCycleImpl”/>
调用方式依次:
getBean(“com.stamen.BeanLifeCycleImpl”)
getBean(“com.stamen.BeanLifeCycleImpl#1″)
getBean(“com.stamen.BeanLifeCycleImpl#2″)
总结:奇技淫巧,只为增广见识,id已经可以解决80%的问题了,name几乎没有出场的机会。
在xml配置文件中,autowire有5种类型,可以在<bean/>元素中使用autowire属性指定:
[xml]
[/xml]
相比bean而言beans少了最后一种装配方式default
可以设置bean使自动装配失效:
采用xml格式配置bean时,将<bean/>元素的autowire-candidate属性设置为false,这样容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其它bean自动装配的候选者,但是该bean本身还是可以用来注入到其它bean的。
现在做java web开发的大家用的说的最多的还是ssh,我在面试人的时候问的最多的也是ssh。如果有人问我spring管理的bean是单例的吗?我会毫不犹豫的回答Yes。那么能让它不是单例的吗?继续Yes,不过有点心虚了,毕竟没有专门去深入了解过,spring只是工作中的工具,以上答案也纯粹是经验之谈。
毕竟实践是检验真理的唯一标准,为此我就实践一把 :“spring单例yes or no”?。
<!–shaxiaozi.applicationContext.xml–>
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”>
<beans>
<bean id=”sTest” class=”com.shaxiaozi.spring.Test”>
<property name=”initFunction” value=”singleton”/>
</bean>
<bean id=”nTest” class=”com.shaxiaozi.spring.Test” singleton=”false”>
<property name=”initFunction” value=”no_singleton”/>
</bean>
</beans>
[java]
package com.shaxiaozi.spring;
/**
* 待初始化类 根据aTest与bTest的值来判断spring的bean管理方式
* @author shaxiaozi
* @version 1.0
**/
public class Test {
private static int aTest;//检测非单例初始化两次
private int bTest;
private String initFunction = “new”;
public STest(){
aTest++;
bTest++;
}
public void printTest(){
bTest++;
System.out.println(“initFunction:”+initFunction);
System.out.println(“static aTest:”+aTest);
System.out.println(“bTest:”+bTest);
}
public void setInitFunction(String initFunction){
this.initFunction = initFunction;
}
}
[/java]
[java]
package com.shaxiaozi.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* 用new来初始化测试执行类
* @author shaxiaozi
* @version 1.0
**/
public class SingletonTest {
public static void main(String[] args) {
//传统方式初始化实体
Test test1 = new Test();
Test test2 = new Test();
System.out.println(“test1==test2):”+(test1==test2));
test1.printTest();
test2.printTest();
}
}
[/java]
执行结果:
initFunction:new
static aTest:1
bTest:2
initFunction:new
static aTest:2
bTest:2
test1==test2:false
结论:bTest被初始化两次,彼此自增一次,aTest也被初始化两次,且test1!=test2,所以new出来的对象是两个不同的实体,引用的不是同一块内存地址。
[java]
package com.shaxiaozi.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* spring默认配置初始化对象测试执行类
* @author shaxiaozi
* @version 1.0
**/
public class SingletonTest {
private static final ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
“shaxiaozi.applicationContext.xml”);
public static void main(String[] args) {
//spring默认配置初始化实体
Test test1 = (Test)applicationContext.getBean(“sTest”);
Test test2 = (Test)applicationContext.getBean(“sTest”);
System.out.println(“test1==test2):”+(test1==test2));
test1.printTest();
test2.printTest();
}
}
[/java]
执行结果:
initFunction:singleton
static aTest:1
bTest:2
initFunction:singleton
static aTest:1
bTest:3
test1==test2:true
结论:bTest被初始化一次,自增两次,aTest也被初始化一次,且test1==test2,所以通过spring bean默认配置获得是单例对象,只在加载application文件的时候被初始化,引用的是同一块内存地址。
[java]
package com.shaxiaozi.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* spring 配置singleton=”false”初始化对象测试执行类
* @author shaxiaozi
* @version 1.0
**/
public class SingletonTest {
private static final ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
“shaxiaozi.applicationContext.xml”);
public static void main(String[] args) {
//spring配置singleton=”false”初始化实体
Test test1 = (Test)applicationContext.getBean(“nTest”);
Test test2 = (Test)applicationContext.getBean(“nTest”);
System.out.println(“test1==test2):”+(test1==test2));
test1.printTest();
test2.printTest();
}
}
[/java]
执行结果:
initFunction:no_singleton
static aTest:2
bTest:2
initFunction:no_singleton
static aTest:3
bTest:2
test1==test2:false
结论:bTest被初始化三次,自增三次,aTest也被初始化三次,且test1!=test2,所以通过spring bean配置singleton=”false”获得总是新的对象引用。
spring单例yes or no?没有答案,场景不同,答案不同,spring默认是单例的,也可以设置成非单例,实际应用场景一般是默认单例。个人浅见:如果不是单例的最好不要用spring去管理,通过第三段代码的执行结果可以看到,在spring加载的时候被初始化的对象,并没有被引用到,导致了无谓的开销。
星期一,我上车,除了坐车的1块钱什么都没带。从起点站坐到终点站,自我感觉一路平静。但是在终点站下车时,发现裤子里多了张纸条:“一个大人出门一个子都不带,丢不丢人啊。– ”
星期二,我揣了个破钱包,里面装了1毛钱。到了终点站后,发现钱还在,钱包里被塞了张纸条:“我们不是乞丐,请不要侮辱我们的职业,。– ”
星期三,我还是揣破钱包,里面装了100块假钞。到了终点站后,发现钱仍然还在,钱包里被塞了张纸条:“私藏大面值**是违法行为,请自觉去相关部门上交。– ”
星期四,我拿了个信封,里面装了叠过期的海峡人才报。到了终点站后,发现信封还在,拿出报纸一看,报纸被换成了最新的海峡人才报,外带1张纸条:“现在是咨询时代,及时更新信息,才能把握机会,赢得成功!– ”
星期五,我在衣兜里放了个玩具手机。到了终点站后,手机仍在,多了张纸条:“请不要开此玩笑影响我公司正常工作。– ”
星期六,我拿了把玩具枪插在腰上。到了终点站后,发现枪不见了,裤腰里被塞了张纸条:“最讨厌你们这些qiangjie的,一点技术含量都没有!没收作案工具!– ”
星期日,我正准备上车,结果人太多没挤上去。正等下一班车的时候,我一摸口袋,发现多了20快钱,还有张纸条:“大哥,干我们这一行的整天风吹日晒的也不容易,敬上20块钱,您想去哪打车去吧,请您别再整我们 “
公交车上超挤,有一女人站在门口。
从车后面挤过来一个GG要下车,跟那女的说了一句:“让一下,下车”。
那个女的没有动。
GG挤过去时就踩到她了。
结果那女人好厉害的,不停地骂:“神经病啊你!神经病啊你!~~”,还超大声,搞得全车都在看。
GG一直没有说话,下车时忍不了了,回头对那女人说:“复读机呀你!”
后边有几个搞笑的小孩,不停地扮演刚才的一幕,
甲说:“你神经病呀你!…………”乙说:“你复读机呀你…………”
全车人暴笑~!
后来,有个小MM也要下车,挤过去怯怯地说:“我~我~我想下去,我不是神经病~!”
全车人再次暴笑~!
那个女人没有说话,可是从边上飘来一句话:“你是不是没电了?”
全车人暴笑不止~!
一天在公交车上,由于拥挤一男一女发生了碰撞。
时髦女郎回头飞眼道:“你有病啊?”
男子觉得莫名其妙,回道:“你有药吗?”
车上人窃笑!
女子觉得生气,回道:“你有精神病啊?”
男子冷面对道:“你能治啊?”
全车人爆笑!
公交司机停车,趴在方向盘上大笑!
Analytics Plugin created by Web Hosting