symlinkjava的简单介绍

博主:adminadmin 2022-12-23 01:18:08 93

本篇文章给大家谈谈symlinkjava,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

hadoop怎样在window上做实验

具体安装的细节就不说了,网络上的资料多得很。主要介绍一下自己的经验所得。首先介绍一下手头的软硬件资源:

NameNode/JobTracker: HP笔记本 i5 2.4GHz 8G 500GB Win7 64位家庭普通版 hadoop 1.1.2 JDK7u21

DataNode/TaskTracker: HP台式机 i3 3.3GHz 4G 500GB Win7 32位专业版 hadoop 1.1.2 JDK7u21

DataNode/TaskTracker: 联想ThinkPad i5 2.5GHz 4G 500GB Win7 64位家庭普通版 hadoop 1.1.2 JDK7u21

首先,安装CygWin(在官网上下的最新版),一定要选上openssh和openssl的包(缺省是不安装的)。 CygWin在各个计算机上的安装目录可以不同。要把CygWin安装目录下的bin目录、usr/bin目录、usr/sbin目录放到系统环境变量Path中。因为,hadoop会执行一些Linux/UNIX形式的命令如bash、whoami等,而这些命令在CygWin中是以Windows系统中的可执行文件形式存放在前面说的目录中。

CygWin装好之后,以管理员的身份运行Cygwin Terminal,执行ssh-host-config配置SSHD服务。CygWin会在Windows系统中新建一个管理员帐号cyg_server(可以按自己换别的),这个帐号就用来跑hadoop的程序了。过程中有好多地方问yes还是no,我试过全部选yes也试过个别选no(按照网上的资料),结果没发现有什么差别。ssh-host-config执行成功后,SSHD会作为一个系统服务在后台运行,每次系统启动都自动开启。这时,要注意检查或配置Windows的防火墙配置,要放开到SSHD服务的入站连接,我的做法是放开到Cygwin安装目录/usr/sbin/sshd的入站连接。

Cygwin Terminal下执行mkpasswd -l /etc/passwd和mkgroup -l /etc/group,主要用途是将Windows的帐号和组别同步到CygWin下。

Windows系统中切换到cyg_server用户(这个帐号的描述缺省是Privileged server),运行Cygwin Terminal,执行ssh-keygen,一直敲回车就行。用ls -a可以看到有一个.ssh的目录,把里面的id_rsa,pub导入到authorized_keys,然后把NameNode上的这个authorized_keys文件,拷贝到所有DataNode和TaskTracker的相同位置下,即 cyg_server用户主目录下的.ssh目录。这样cyg_server用户就可以不需要密码就可以远程登录各个计算机和执行命令。

Hadoop是用java开发的,因此,系统中要有java的运行环境,可以从Oracle的官网下最新的JDK安装,注意是JDK,不是JRE(因为需要用到bin目录下的server目录)。安装的位置必须全部计算机都一样(因为碰到过在DataNode上找不到java程序的情况),那也就是在C:\下面了,给安装目录起一个简短的名称(不要带空格)。在系统环境变量Path中,将JDK安装目录下的bin目录所在路径添加进去。跟SSHD一样,要修改Windows防火墙的入站规则,放开到JDK的java程序网络连接。

到这里,Hadoop主要的运行条件基本具备了,可以安装Hadoop了。过程很简单,从hadoop.apache.org下载一个hadoop的tar.gz包(我下的是1.1.2版本),解压到一个目录下就可以了。这里要注意的是,最好全部操作都在Windows的cyg_server帐号下执行,而且,hadoop解压后存放的目录要所有计算机都一样,例如都放在C:\hadoop-1.1.2目录下。

Hadoop是用java开发的,虽然java号称支持跨平台运行。但是,基于Linux的Hadoop移到Windows平台上时,依然出现严重水土不服,即使是在Cygwin的环境下也一样。同样一段java代码,在Linux下的表现和在Windows下的表现会不一样,导致Windows下运行的Hadoop经常出现异常而终止运行。

实验中大部分的时间都是用来探究引起水土不服的原因,把它消除掉。 下面介绍一下我对这些问题采取的一些解决办法。

众所周知,文件路径在Linux下和在Windows下的解析是不一样的。在Cygwin中运行Windows版本的java时,两种不同形式的文件路径一起出现会导致程序异常。Cygwin下对C:\hadoop-1.1.2的解析是/cygdrive/c/hadoop-1.1.2,而Windows版本的java对'/cygdrive/c/hadoop-1.1.2'的解析又变成C:\cygdrive\c\hadoop-1.1.2,由于这是一个不存在的文件路径,所以Hadoop经常抛出异常说文件找不到,或者自己直接把这个路径创建了(例如,DataNode存放HDFS文件块时寻找dfs.data.dir时)。要解决这个问题,可以利用Windows7的文件链接的特性(类似于linux的链接ln -s),在C:\下创建cygdrive目录,在这个目录里执行MKLINK /D c C:\创建一个到目的目录的目录链接。这样当java访问C:\cygdrive\c\hadoop-1.1.2时就会如我们所愿访问到C:\hadoop-1.1.2这个目录。

能不能用ln -s命令来建这样的链接呢?答案是不行的。Hadoop的源代码中就使用了这样的方法,可是Windows的java不能识别,因此,TaskTracker就不能执行JobTracker分配给它的Task任务。对于这样的情况,除了修改Hadoop代码,好像还没别的办法。要修改的是org.apache.hadoop.fs包里的FileUtil.java文件,里面有一个symLink方法,就是用了ln -s的办法来建文件链接,我们要把它改成使用Windows7的方式建立文件链接。原代码如下:

public static int symLink(String target, String linkname) throws IOException{

String cmd = "ln -s " + target + " " + linkname;

Process p = Runtime.getRuntime().exec(cmd, null);

int returnVal = -1;

try{

returnVal = p.waitFor();

} catch(InterruptedException e){

//do nothing as of yet

}

if (returnVal != 0) {

LOG.warn("Command '" + cmd + "' failed " + returnVal +

" with: " + copyStderr(p));

}

return returnVal;

}

修改后,变成如下的样子

public static int symLink(String target, String linkname) throws IOException{

// String cmd = "ln -s " + target + " " + linkname;

String newTarget;

String newLinkname;

newTarget = new CygPathWinCommand("C:" + target).getResult();

newLinkname = new CygPathWinCommand(linkname).getResult();

String cmd = "CMD /C \"MKLINK /D " + newLinkname + " " + newTarget + "\"";

Process p = Runtime.getRuntime().exec(cmd, null);

int returnVal = -1;

try{

returnVal = p.waitFor();

} catch(InterruptedException e){

//do nothing as of yet

}

if (returnVal != 0) {

LOG.warn("Command '" + cmd + "' failed " + returnVal +

" with: " + copyStderr(p));

}

return returnVal;

}

private static class CygPathWinCommand extends Shell {

String[] command;

String result;

CygPathWinCommand(String path) throws IOException {

command = new String[]{"cygpath", "-d", path};

run();

}

String getResult() throws IOException {

return result;

}

protected String[] getExecString() {

return command;

}

protected void parseExecResult(BufferedReader lines) throws IOException {

String line = lines.readLine();

if (line == null) {

throw new IOException("Can't convert '" + command[2] +

" to a cygwin path");

}

result = line;

}

}

红色部分就是改动后的代码。其中CygPathWinCommand是新加的一个类,它是复制原来CygPathCommand类的样子来作的,只不过原来是使用cygpath -u命令,这里使用cygpath -d命令。

Hadoop在创建完链接或者目录后,通常都设置Linux/Unix形式的访问权限。这在Windows系统上是没有作用的事。所以,Hadoop的文件权限设置操作是无效的,所以当Hadoop验证文件权限设置结果时就会抛出异常而终止。我们可以改动代码,不让它终止。Hadoop验证文件权限的操作是通过org.apache.hadoop.fs包里FileUtil.java文件的checkReturnValue方法实现的,原代码如下:

private static void checkReturnValue(boolean rv, File p,

FsPermission permission

) throws IOException {

if (!rv) {

throw new IOException("Failed to set permissions of path: " + p +

" to " +

String.format("%04o", permission.toShort()));

}

}

修改很简单,不让它抛异常就行了

private static void checkReturnValue(boolean rv, File p,

FsPermission permission

) throws IOException {

if (!rv) {

LOG.info("Failed to set permissions of path: " + p +

" to " +

String.format("%04o", permission.toShort()));

}

}

除了文件路径解析和文件权限设置两个方面,Linux下和在Windows下的进程和线程管理也是不一样的。这会导致org.apache.hadoop.mapred包里JvmManager.java文件里的kill方法抛出异常,原代码如下

synchronized void kill() throws IOException, InterruptedException {

if (!killed) {

TaskController controller = tracker.getTaskController();

// Check inital context before issuing a kill to prevent situations

// where kill is issued before task is launched.

String pidStr = jvmIdToPid.get(jvmId);

if (pidStr != null) {

String user = env.conf.getUser();

int pid = Integer.parseInt(pidStr);

// start a thread that will kill the process dead

if (sleeptimeBeforeSigkill 0) {

new DelayedProcessKiller(user, pid, sleeptimeBeforeSigkill,

Signal.KILL).start();

controller.signalTask(user, pid, Signal.TERM);

} else {

controller.signalTask(user, pid, Signal.KILL);

}

} else {

LOG.info(String.format("JVM Not killed %s but just removed", jvmId

.toString()));

}

killed = true;

}

}

在网上找了好久,终于找到一篇老外的文章讲这个问题,改动也比较简单

synchronized void kill() throws IOException, InterruptedException {

if (!killed) {

TaskController controller = tracker.getTaskController();

// Check inital context before issuing a kill to prevent situations

// where kill is issued before task is launched.

String pidStr = jvmIdToPid.get(jvmId);

if ((pidStr != null) !(pidStr.isEmpty())) {

String user = env.conf.getUser();

int pid = Integer.parseInt(pidStr);

// start a thread that will kill the process dead

if (sleeptimeBeforeSigkill 0) {

new DelayedProcessKiller(user, pid, sleeptimeBeforeSigkill,

Signal.KILL).start();

controller.signalTask(user, pid, Signal.TERM);

} else {

controller.signalTask(user, pid, Signal.KILL);

}

} else {

LOG.info(String.format("JVM Not killed %s but just removed", jvmId.toString()));

}

killed = true;

}

}

在我的实验中,代码的改动到这里,Hadoop基本就可以跑起来了,HDFS和MapReduce应用都可以运行。下面介绍一下怎么编译改动后的代码。我不是java程序员,只会用原始笨拙的办法去调试和编译。Hadoop的源码在src目录下,在我实验中是C:\hadoop-1.1.2\src,里面有好几个子目录,我们要改动的JvmManager.java文件和FileUtil.java文件都在core子目录下。由于Hadoop是在Linux环境中开发的,所以我们编译最好也在Linux环境下(我试过Windows环境,结果不行,技术有限,没法解决)。首先把这些源文件拷到一台Linux,我的做法是直接下个hadoop的tar.gz包,解压到/var/tmp下,源码就在/var/tmp/hadoop-1.1.1/src目录下了。

1)先解压jar包,我们改动的源码最后都编译打包到hadoop-core-1.1.2.jar包里

cd /var/tmp

mkdir newjar

cp /var/tmp/hadoop-1.1.2/hadoop-core-1.1.2.jar /var/tmp/newjar

cd newjar

jar -xvf hadoop-core-1.1.2.jar

rm -f hadoop-core-1.1.2.jar

2)编译改动后的源码

cd /var/tmp/hadoop-1.1.2/src/core

javac -cp /var/tmp/hadoop-1.1.2/lib/commons-logging-1.1.1.jar:/var/tmp/hadoop-1.1.2/hadoop-core-1.1.2.jar org/apache/hadoop/mapred/JvmManager.java

javac -cp /var/tmp/hadoop-1.1.2/lib/commons-logging-1.1.1.jar:/var/tmp/hadoop-1.1.2/hadoop-core-1.1.2.jar org/apache/hadoop/fs/FileUtil.java

3)打jar包

cp org/apache/hadoop/mapred/*.class /var/tmp/newjar/org/apache/hadoop/mapred

cp org/apache/hadoop/fs/*.class /var/tmp/newjar/org/apache/hadoop/fs

cd /var/tmp/newjar

jar cvfm /var/tmp/test.jar META-INF/MANIFEST.MF .

把test.jar拷下来,替换掉所有计算机的hadoop-core-1.1.2.jar就可以了。

好了,所有事情都就绪了,配置好hadoop的各种配置文件后,顺利启动了hadoop的HDFS和MapReduce框架,以下是进行的一些测试

hadoop jar C:/hadoop-1.1.2/hadoop-test-1.1.2.jar TestDFSIO -write -nrFiles 10 -sizeFile 1000 执行成功,但吞吐量不是很理想

hadoop jar C:/hadoop-1.1.2/hadoop-test-1.1.2.jar TestDFSIO -read -nrFiles 10 -sizeFile 1000 执行成功,但吞吐量比前面的测试还差

hadoop jar C:/hadoop-1.1.2/hadoop-examples-1.1.2.jar randomwriter random-data 执行成功,但时间花了两个多小时,处理的数据有20GB多

hadoop jar C:/hadoop-1.1.2/hadoop-examples-1.1.2.jar sort random-data sorted-data 执行成功,但时间也是花了两个多小时,处理的数据有20GB多

hadoop jar C:/hadoop-1.1.2/hadoop-test-1.1.2.jar testmapredsort -sortInput random-data -sortOut sorted-data 执行成功,但时间也是花了两个多小时,,处理的数据还是20GB多但时间好像还更长些

hadoop jar C:/hadoop-1.1.2/hadoop-examples-1.1.2.jar wordcount /user/cyg_server/tbdata_big output 其中tbdata_big是一个3GB多的文本文件,里面有1亿3千万行文本。实验环境给出的性能是7分钟16秒。自己在NameNode上写一个perl脚本做wordcount相同的事情,耗时562秒。这个......Hadoop只快了106秒。是不是数据太少了?

Windows下.symlink相关问题

嗯,在草草结束了大二下《面向对象程序设计》课程后的某一天,偶然打开了当时装的eclipse,发现已经不能如当时一样正常打开了,返回错误信息大概是jre下的javaw.exe路径错误。

嗯,由于有些强迫症倾向的安装路径习惯,总是习惯于把软件安装在E盘,而不是默认的C:\Program Files。

前往路径C:\ProgramData\Oracle\Java\javapath,发现这个文件下面有3个.symlink类型的文件,嗯,后来知道了,这个叫软链接文件。操作这样的文件命令主要是(mklink命令),所以在此记录下网络上了解到的关于这个命令的相关知识。

软链接的概念来源于Linux,从Windows Vista之后的版本,Windows操作系统也可以使用,主要效果是一个目录或一个文件有多个入口,有点类似快捷方式,而且占空间很小。其好处呢,引用CSDN:

下面就主要集中在mklink这个命令了,先来看DOS自带的帮助说明:

比如D:\temptation目录下有目录dir1,我们想在当前目录下创建到dir1目录的软链接,可以使用如下命令来操作:

注意:/D创建的是符号链接(也就是软链接),文件类型为SYSLINKD;/J创建的是联接(目录联接),文件类型为JUNCTION。

文件的软链接就不再举例的,另外对于文件还可以创建硬链接。硬链接则是生成一份一模一样的文件,有点类似复制,但如果对硬链接文件或原始文件进行修改,两者的内容会同步变动。

以上就是关于Windows中.symlink文件以及创建它的命令的相关内容。

Linux下在.bash_profile文件下配置JDK环境变量,生效后执行java -version命令后提示错误信息如下:

应该说明你安装什么版本的JDK。

安装在哪里,现在的配置是什么?

以正常使用的为例

1,下载JDK,解压

然后移动/usr/local/java

具体哪个位置,什么命名,自己定义

2.假如有Tomcat一样的如上类似的设定。

3,vi /etc/profile

在最后一行后加入下面的内容。

JAVA_HOME="/usr/local/java"

CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"

CATALINA_HOME="/usr/local/tomcat"

PATH=".:$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:"

export JAVA_HOME CATALINA_HOME

4.source /etc/profile 即可生效。

当然在.bash_profile 也是一样的。只是生效在当前的用户下。

如何制作安卓平板系统镜像

一:update.zip包的制作

1:新建一个目标,在此目录下准备好需要的文件,如system目录文件、boot.img、recovery.img等.

mkdir testupdate

cp system/ testupdate/ -tf

注:如果文件是system.img镜像可以用unyaffs解压出来得到system

2:用make-update-script工具生成update-script脚本,如下

cp make-update-script testupdate/

cp android-info.txt testupdate/

cd testupdate

./make-update-script system android-info.txt update-script

rm make-update-script android-info.txt

vi update-script //根据需要适当修改些脚本

说明:system是要更新的目录,android-info.txt是板的版本信息,update-script是输出文件名

3:建立一个目录名称为META-INF/com/google/android,把上面生成的脚本放进去

mkdir -p META-INF/com/google/android

mv update-script META-INF/com/google/android/

4:压缩文件

zip -r update.zip system META-INF

5:给压缩文件添加签名

mv update.zip ../signapk/

cd ../signapk/

java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip signed-update.zip

6:删除多余的文件,并把生成的包重命名

rm update.zip

mv signed-update.zip ../update.zip

cd ../

7:大功告成,把更新包update.zip拷到sdcard根目录下去验证吧!

注意:

1)如果文件里有连接,应该在获取update-script之后在原文件里删除链接文件,再打包,否则symlink将出错;

2)如果原文件里有空目录,所获的签名将失去此记录,所以如果空目录必须存在,更新之后的文件将与原文件不同(少了空目录)

二:ramdisk.img 制作

方法1:

解压:

1) mv ramdisk.img ramdisk.img.gz

2) gunzip ramdisk,img.gz

3) mkdir ramdisk;cd ramdisk

4) cpio -i -F ../ramdisk.img

压缩:

1) 产生要pack的目录list,也可以自己列

cpio -i -t -F ../ramdisk.img list

2) 利用刚生成的list文件列表,cpio归档

cpio -o -H newc -O new.img list

3) gzip new.img

方法2:

解压: gunzip -c ../your-ramdisk-file | cpio -i

压缩: find . | cpio -o -H newc | gzip ../newramdisk.cpio.gz

注意:在android里的做法是

1)先得到ramdisk所需要的文件,比如root目录

2)用mkbootfs制作ramdisk.img,用法如下

mkbootfs root | gzip ramdisk.img

这里需要验证哪个能用android写下去

三:boot.img的制作

1:android正常做法

1):连接

mkbootimg --kernel your-kernel-file --ramdisk newramdisk.cpio.gz --cmdline "mem=128 console=ttymxc0,115200n8 init=/init rw" --output mynewimage.img

mkbootimg --kernel your-kernel-file --ramdisk newramdisk.cpio.gz --cmdline --output mynewimage.img

2):提取img中的kernel和ramdisk

./split_bootimg.pl mynewimage.img

2:uboot

直接把uImage重命名为boot.img即可

四:system.img的制作(只为 yaffs2格式)

1)压制:./mkyaffs2image system/ system.img

2)解压:./unyaffs system.img

四:system.img的制作(只为yaffs2格式)

1)压制:./mkyaffs2image system/ system.img

2)解压:./unyaffs system.img

五:recovery.img的制作

1:如果recovery的镜像是只有文件系统部分时候可以如第四所示范

2:如果recovery为ramdisk形式

=============================================

制 作ramdisk的过程。

1.在/mnt下创建rdmnt 和 rdimg 目录

mkdir rdmnt

mkdir rdimg

2.创建一个ramdisk文件,大小32768 X 1k。

dd if=/dev/zero of=rdimg/ramdisk bs=1k count=32768

3.使用ext2方式格式该文件

mke2fs -F -v -m0 rdimg/ramdisk

4.将该ramdisk文件和rdmnt挂载

mount -o loop rdimg/ramdisk rdmnt/

5.拷贝文件到挂载目录中。

文件系统目录在:/home/xrqun/workdir/filesys/

cp –av /home/xrqun/workdir/filesys/* rdmnt

6.卸载ramdisk

umount rdmnt

7.压缩 ramdisk文件

gzip –c -9 rdimg/ramdisk rdimg/ramdisk.gz

8.拷贝该ramdisk.gz映像到tftpboot目录下

cp rdimg/ramdisk.gz /tftpboot/

9. 使用mkimage工具

mkimage -n "uboot.ramdisk.filesys" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz uboot.ramdisk.gz

参考资料:

我在设置java环境变量不小心把path系统变量删除了,怎么办呢?

跟你都安了什么用到path的软件有关系

最基本的path:

C:\Windows\system3;C:\Window;C:\Windows\System32\Wbe;C:\Windows\System32\WindowsPowerShell\v1.0;

我的PATH:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath;%JAVA_HOME%\bin;C:\Program Files (x86)\ScanSign;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\MongoDB\Server\3.4\bin;C:\Users\Administrator\AppData\Roaming\npm;%NVM_HOME%;%NVM_SYMLINK%;C:\Program Files\MySQL\MySQL Utilities 1.6\;C:\Redis-x64-3.2.100;C:\Program Files\TortoiseSVN\bin;D:\MongoDB\Server\3.6\bin;$HADOOP_HOME$/bin;$HADOOP_HOME$/sbin;%MAVEN_HOME%\bin\;C:\MinGW\bin;C:\Program Files\Git\cmd;C:\curl-7.61.1\I386;D:\work\tool\gradle-5.0\bin;D:\Program Files\nodejs\;D:\Java\jdk1.8.0_121\db\bin;

另外就是看那些程序不能运行了 就加到path里吧。

symlinkjava的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、symlinkjava的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-23,除非注明,否则均为首码项目网原创文章,转载请注明出处。