Pages

Monday, May 23, 2016

How to connect to HDFS using java ?

How to connect to HDFS using java ?





Required library files

For coludera distribution 

1. log4j-1.2.17.jar


2. commons-logging-1.0.4.jar

3. guava-r09-jarjar.jar


4. hadoop-core-0.20.2.jar


For hadoop 2.7.2  : required jars  ( all are located at common/lib folder )


  1. commons-io-2.4.jar       
  2.   guava-11.0.2.jar    
  3.    hadoop-common-2.7.2.jar 
  4.  htrace-core-3.1.0-incubating.jar 
  5.  protobuf-java-2.5.0.jar 
  6.  slf4j-api-1.7.10.jar
  7. commons-logging-1.1.3.jar 
  8.  hadoop-auth-2.7.2.jar 
  9.  hadoop-hdfs-2.7.2.jar  
  10.   log4j-1.2.17.jar   


Location :

In master node , hadoop version will show the core jar to use



[root@oel6 ~]# hadoop version
Hadoop 0.20.2-cdh3u6
Subversion file:///data/1/tmp/topdir/BUILD/hadoop-0.20.2-cdh3u6 -r efb405d2aa54039bdf39e0733cd0bb9423a1eb0a
Compiled by root on Wed Mar 20 13:11:26 PDT 2013
From source with checksum 3277b62b2872d77555cfbc5a202f81c4
This command was run using /usr/lib/hadoop-0.20/hadoop-core-0.20.2-cdh3u6.jar


So use /usr/lib/hadoop-0.20/hadoop-core-0.20.2-cdh3u6.jar

Basic Code :

http://www.folkstalk.com/2013/06/connect-to-hadoop-hdfs-through-java.html

Read FileSystem

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;

public class ReadFileSystem {
public static void main(String[] args) throws IOException, URISyntaxException
{
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(new URI("hdfs://IP:9000"),conf);

FileStatus[] fileStatus = hdfs.listStatus(new Path("hdfs://IP:9000/new"));
Path[] paths = FileUtil.stat2Paths(fileStatus);

System.out.println("***** Contents of the Directory *****");
for(Path path : paths)
{
System.out.println(path);
}


}
}

hdfs getconf -confKey fs.default.name in server 

shows correct dfs location

Sample output :

***** Contents of the Directory *****
hdfs://IP:9000/new/123.txt
hdfs://IP:9000/new/newww.txt
hdfs://IP:9000/new/sterin.txt
hdfs://IP:9000/new/ucm
hdfs://IP:9000/new/valut
hdfs://IP:9000/new/weblayout


Write a file to HDFS


import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class CopyFileToHDFS {
public static void main(String[] args) throws IOException, URISyntaxException
{
//1. Get the instance of COnfiguration
Configuration configuration = new Configuration();
//2. Create an InputStream to read the data from local file
InputStream inputStream = new BufferedInputStream(new FileInputStream("/tmp/sample.txt"));
//3. Get the HDFS instance
FileSystem hdfs = FileSystem.get(new URI("hdfs://IP:9000"), configuration);
//4. Open a OutputStream to write the data, this can be obtained from the FileSytem
OutputStream outputStream = hdfs.create(new Path("hdfs://IP:9000/forsterin/Hadoop_File.txt"),
new Progressable() {
@Override
public void progress() {
System.out.println("....");
}
});
try
{
IOUtils.copyBytes(inputStream, outputStream, 4096, false);
}
finally
{
IOUtils.closeStream(inputStream);
IOUtils.closeStream(outputStream);
}
}
}



Wednesday, May 18, 2016

How to get expired contents and set new expired date using RIDC ?

How to get expired contents and set new  expired date using RIDC ?

Purpose : To list all the expired content and set new expired date in bulk . There is no database update is required for this .


Java Class : https://github.com/sterin501/expiredContent



Detailed steps :


1. Set config.properties for connection details .
2. Set StartDate and EndDate for search query . To list all the expired contents use blank values 





in unix

3. 


. ./classpath


4. To get expired content :


java -classpath $CLASSPATH GetExpired

Content.txt will have the expired date 

5. To update the expired Date :

java -classpath $CLASSPATH UpdateExpiredDate


in windows

3. call classpath.bat

4. java -classpath %CLASSPATH% GetExpired

5 . java -classpath %CLASSPATH% UpdateExpiredDate


OR



java -classpath .oracle.ucm.ridc.jar;. GetExpired


java -classpath .oracle.ucm.ridc.jar;. UpdateExpiredDate 



Sample run:

[sterin@sterinlap expiredContent]$ . ./classpath
[sterin@sterinlap expiredContent]$ java GetExpired 
ContentID is : STJACOBPC1IDCO003530 3131
ContentID is : STJACOBPC1IDCO003522 3123
ContentID is : STJACOBPC1IDCO003527 3128
[sterin@sterinlap expiredContent]$ java UpdateExpiredDate
Updating STJACOBPC1IDCO003530


@Properties LocalData
UserDateFormat=iso8601
IdcService=UPDATE_DOCINFO
dDocName=STJACOBPC1IDCO003530
UserTimeZone=UTC
dOutDate=2017-04-29 08:59:00
dID=3131
@end
Updating STJACOBPC1IDCO003522


@Properties LocalData
UserDateFormat=iso8601
IdcService=UPDATE_DOCINFO
dDocName=STJACOBPC1IDCO003522
UserTimeZone=UTC
dOutDate=2017-04-29 08:59:00
dID=3123
@end
Updating STJACOBPC1IDCO003527


@Properties LocalData
UserDateFormat=iso8601
IdcService=UPDATE_DOCINFO
dDocName=STJACOBPC1IDCO003527
UserTimeZone=UTC
dOutDate=2017-04-29 08:59:00
dID=3128
@end
[sterin@sterinlap expiredContent]$ java GetExpired 
[sterin@sterinlap expiredContent]$ 

Script to Set new dOutDate for Expired Content Using RIDC (Doc ID 2139331.1)

Friday, May 13, 2016

How to mount hadoop or hdfs file system in linux?


How to mount hadoop or hdfs file system in linux?



Purpose : To mount hdfs file in linux . It mainly use to dump the file and read only purpose .

Since hadoop-fuse-dfs is cloudera based solution , it is better to install both server and client installed from cloudera distribution itself


Steps :
1.Install hadoop on both servers and client :
2.Run the mount command in client


Detailed Steps :

A. Hadoop install I( in both client and server from cloudera distribution )



Steps :

1. Add cloudera distribution & Install hadoop-0.20-fuse ( this will install hadoop server)


wget http://archive.cloudera.com/redhat/6/x86_64/cdh/cdh3-repository-1.0-1.noarch.rpm
yum --nogpgcheck localinstall cdh3-repository-1.0-1.noarch.rpm

yum install hadoop-0.20-fuse



2.set JAVA_HOME ( for both client and server)

hadoop-env.sh
Location:/usr/lib/hadoop-0.20/conf/

Export JAVA_HOME=


3. Configure hadoop in server and start

a. core-site.xml
Location :/usr/lib/hadoop-0.20/conf/
<property>
<name>hadoop.tmp.dir</name>
<value>/path/to/your/directory/hadoop-${user.name}</value>
</property>

<property>
<name>fs.default.name</name>
<value>hdfs://IP:9000</value>
</property>

b. Edit hdfs-site.xml
Location :/usr/lib/hadoop-0.20/conf/
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>


C. Edit  mapred-site.xml
Location :/usr/lib/hadoop-0.20/conf/

<property>
  <name>mapred.job.tracker</name>
  <value>master:9001</value>
</property>

d. Format Hadoop



hadoop namenode -format



e. start the hadoop


Location :/usr/lib/hadoop-0.20/bin
start-dfs.sh
start-mapred.sh

Use jps to verify the process



f. Use netstat to verify the hdfs port here :900


netstat -an | grep 9000
tcp 0 0 IP:9000 0.0.0.0:* LISTEN
tcp 0 0 IP:9000 10.184.37.158:45227 ESTABLISHED

4. In client

Set JAVA_HOME and create new folder for mount

a.run in debug mode to verify the connection

format :hadoop-fuse-dfs -d dfs://IP:9000 /home/hduser/mount/

$ hadoop-fuse-dfs -d dfs://IP:9000 /home/hduser/mount/
INFO fuse_options.c:116 Ignoring option -d
INFO fuse_options.c:165 Adding FUSE arg /home/hduser/mount/
FUSE library version: 2.8.3
nullpath_ok: 0
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56
INIT: 7.20





hdfs getconf -confKey fs.default.name in server 

shows correct dfs location  . 

5 . Once mounting is fine ( it will show all the permission and users with out “?”)

then run the same command with out -d

Incorrect Mounting:

d?????????? ? ? ? ? ? mount

Correct Mounting

drwxr-xr-x. 2 hduser nobody 4096 Dec 31 1969 mount


Note : After mounting operation like copy or move works fine . But editing , appending the file is not possible .  

Monday, May 2, 2016

Hadoop single node installation on linux


Hadoop single node installation on  linux



Purpose : Install Hadoop in single machine ,then use put file to Hadoop file system and get those files

Steps :


1.Download and installation of Hadoop
2.Configuration
3.Use Basic command like ls, put,get,

Detailed Steps :

A. Hadoop install

Prerequisites

1.Install JAVA
2.Create hduser in OS
3. Enable SSH

Steps :

1. Download hadoop-2.6.4.tar.gz : http://hadoop.apache.org/releases.html

2. copy to /opt/app

3. tar -xzf hadoop-2.6.4.tar.gz

4.mv hadoop-2.6.4 hadoop

5. chown -R hduser:hduser hadoop

B. Start and Verify

1. edit hadoop-env.sh

Add export JAVA_HOME=

OR edit bash profile with JAVA_HOME

2. go to /opt/app/hadoop/sbin

3. ./start-all.sh (provide , password when required)


[hadoop@sterinlap sbin]$ ./start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.
Starting namenodes on []
hadoop@localhost's password:
localhost: starting namenode, logging to /opt/app/hadoop/logs/hadoop-hadoop-namenode-sterinlap.out
hadoop@localhost's password:
localhost: starting datanode, logging to /opt/app/hadoop/logs/hadoop-hadoop-datanode-sterinlap.out
Starting secondary namenodes [0.0.0.0]
hadoop@0.0.0.0's password:
0.0.0.0: starting secondarynamenode, logging to /opt/app/hadoop/logs/hadoop-hadoop-secondarynamenode-sterinlap.out
starting yarn daemons
starting resourcemanager, logging to /opt/app/hadoop/logs/yarn-hadoop-resourcemanager-sterinlap.out
hadoop@localhost's password:
localhost: starting nodemanager, logging to /opt/app/hadoop/logs/yarn-hadoop-nodemanager-sterinlap.out

4. Verify the process by

ps -ef | grep hadoop

[hduser@sterinlap sbin]$ ps -ef | grep hadoop
hduser 9745 1 20 11:22 pts/5 00:00:06 /home/sterin/Public/jdk1.8.0_45/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.di

hduser 10077 1 23 11:22 ? 00:00:06 /home/sterin/Public/jdk1.8.0_45/bin/java -Dproc_nodemanager

Total : 2 process
5. Verify hadoop command by “hadoop fs -ls”

Location of commands : /opt/app/hadoop/bin

/opt/app/hadoop/bin/hadoop fs -ls


Found 11 items
-rwxr-xr-x 1 oracle oracle 159223 2016-02-12 15:27 container-executor

( Even though this shows current path , just to verify the installation )


6. Stop all Hadoop process

/opt/app/hadoop/sbin/stop-all.sh

Configuration

1. Create tmp directory for hadoop,

under /opt/app/hadoop : /opt/app/hadoop/tmp

2.edit core-site.xml
/opt/app/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/app/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>

<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
</configuration>


3. Create mapred-site.xml

Location :/opt/app/hadoop/etc/hadoop/

cp mapred-site.xml.template mapred-site.xml




4. Edit mapred-site.xml


<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
</configuration>




5. Create namenode and the datanode folders

Location : /opt/app/hadoop/

mkdir hadoop_store/hdfs/namenode
mkdir hadoop_store/hdfs/datanode


6. Edit hdfs-site.xml

Location : /opt/app/hadoop/etc/hadoop/

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/app/hadoop/hadoop_store/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/app/hadoop/hadoop_store/hdfs/datanode</value>
</property>
</configuration>

7. Add path in bashrc ( bash profile under home directory)

edit .bashrc

PATH=$PATH:/opt/app/hadoop/bin


8. Format the hadoop file system

hadoop namenode -format


16/04/25 12:11:03 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = -10-184-37-177.in..com/10.xx.37.177
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.6.4





16/04/25 12:11:05 INFO util.ExitUtil: Exiting with status 0
16/04/25 12:11:05 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at l-10-184-37-177..com/10.xx.37.177





9. Start the hadoop

Location :/opt/app/hadoop/sbin

./start-all.sh ( like step B-2)

10. jps


12882 NameNode
13189 DataNode
14152 NodeManager
13816 ResourceManager
13529 SecondaryNameNode
14394 Jps



11. Checking the file system ( listing the files )


hadoop fs -ls /

It will be blank

12. create new folder


hadoop fs -mkdir /new




13. Verify it :

hadoop fs -ls /
Found 1 items
drwxr-xr-x - sterin supergroup 0 2016-04-25 12:18 /new


14. Put Command
fs -put /tmp/sterin /new

<source> <target>
/tmp/sterin : My local file

/new : In Hadoop

hadoop fs -put /tmp/sterin /new








15 . Get command

hadoop fs -get /new/sterin /home/sterin/Downloads/Chrome






/new/sterin : In hadoop source

/home/sterin/Downloads/Chrome : Local file system



URLs : http://localhost:50070/ web UI of the NameNode daemon

Monday, April 4, 2016

How to upload or download very large files with out any issue ?

How to upload or download very large files with out any issue ?



Things to consider for uploading and downloading the large files to UCM




Many configuration required for dealing with very large file ( more than 10gb) . It also involves many factors like network speed , UCM server capacity , weblogic configuration etc . This blog to help get more data and set the configuration


1. Make server Ready

12C server is ready by default . No need to install any patches on weblogic server and on Oracle_ECM

For 11g server , Below patches should be installed

For upload : 16083651 & 16960063

For Download : 14339868 ( this is only for Native File download , web layout works with out patch)


2. Setting required in the client

In 64 bit machine


Use Chrome 64 bit browser , that is best option for uploading file larger than 4 GB
IE 11 , Latest FireFox might work



In 32 bit machine



It allows only 2 GB size for upload . So we have to enable Chunking for upload. It is basically split the files based on the value set . Server will club all the parts together . It is more time consuming than browser upload .

It is based on Java applet . So browser and your network should support applet usage

To enable Chunking , add below entries in config.cfg of UCM

AppletChunkThreshold=10000000 // size in bytes , chucking will start only after this size
AppletChunkSize=10000000 // each size of the packets send from client
ChunkedRequestTrace=true
MultiUpload=true
DisableHttpUploadChunking=false



3. Setting Max time for weblogic thread

We have to increase the thread time out in weblogic console . By default value is 10 min ( 600 sec), if the upload or download take more than 10 min , weblogic will kill the thread ,upload process will stopped .

How to set : Weblogic console → Servers → UCM server → Configration → Tunning

Set : Stuck Thread max time





4. How to get Value for “Stuck Thread max time “

This is specific to each environment . Get the maximum file to upload or download

Test this RIDC upload code .

Get the RIDC code mention here :


it will show the network speed and Server Capacity , So “ Stuck Thread max time” should be more than total time required for upload . In the example

Time took in UCM server is 45.422 sec
Processing Capacity of your environment 34459.44696402624 KB/s
Processing Capacity of your environment 34.45944696402624 MB/s


So here no need to change the value . If it more than 600 sec , then “ Stuck Thread max time” should be edited .


5. Get the optimal value for AppletChunkThreshold & AppletChunkSize

We have to do trail and error method . Providing details from different test cases

Size of the file to upload to UCM : 13 gb

Upload Method : Using Chunk Applet

Test Case 1 :
AppletChunkThreshold=10000000
AppletChunkSize=10000000  ( 10 MB)
StuckThreadMaxTime=600 sec ( 10 min) (default value )
Even thoug it shows Checkin is fine but no time spend in the logs . Which means check in is failed . And it failed due to weblogic thread time out .
Test Case 2.a :
AppletChunkThreshold=10000000
AppletChunkSize=1000000000  ( 1GB)
Upload failed in the client system itself

Test Case 2.b :
AppletChunkThreshold=10000000
AppletChunkSize=500000000  ( 500 MB)
Upload cause performance issues in in client . So I stopped the upload

Test Case 3 :
AppletChunkThreshold=10000000
AppletChunkSize=100000000  ( 100 MB)
This causing performance issues in server . Server CPU went up to 100%

Test Case 4 :
AppletChunkThreshold=10000000
AppletChunkSize=50000000  ( 50 MB)
StuckThreadMaxTime=900 sec ( 15 min)
Checkin failed in the system due to thread time out in weblogic .
Last CHUNKED_UPLOAD finished it . It took 528 sec
CHUNKED_UPLOAD [dUser=weblogic][IsJava=1] 528.179931640625(secs)
Test Case 5 :

AppletChunkThreshold=1000000000
AppletChunkSize=40000000 ( 40 MB)
StuckThreadMaxTime=1200 sec ( 20 min)
I am able to check in the file in the UCM with this settings .
Total time : 1070.6832275390625(secs)
Last Chunk : 526.7379150390625(secs)
>requestaudit/6 03.11 11:54:51.750 IdcServer-10 CHECKIN_NEW [dID=1054][dDocName=STJACOBPC1IDCO001218][dDocTitle=WSS][dUser=weblogic][dSecurityGroup=Public][StatusCode=0][StatusMessage=Successfully checked in content item 'STJACOBPC1IDCO001218'.][IsJava=1] 1070.6832275390625(secs)


>requestaudit/6 03.11 11:54:51.763 IdcServer-349 CHUNKED_UPLOAD [dUser=weblogic][IsJava=1] 526.7379150390625(secs)




Last Chunk is the process which will club all the parts together , it is really time consuming process .This can be saved if 64 bit chrome browser is used 

Sunday, April 3, 2016

RIDC sample code to get Network Speed , UCM server capacity ,upload status

RIDC sample code to get Network Speed , UCM server capacity ,upload status 



This is mainly intended for large file upload ( 1.5 GB+).

JDK 1.8+ required .

Purpose : Sample code to provide
1.Status of upload process
2.Speed of network
3. Capacity of UCM server

UCM checkin process has 3 main file process

1. Send file to UCM server , UCM server keeps this file in temp directory of UCM server
2. Copy this temp file to Native File Location
3. Delete the Temp file created
4. Wait for the conversion and if there is no conversion copy Native File to Web layout

To get valid response from UCM server step 1,2,3 should be over . This code will help us to get speed of step1 ( Network speed ) , step 2&3 for the UCM capacity






Detailed Steps :

1. Download code  from : https://github.com/sterin501/CheckinSpeed.git


2.Edit config.properties

with URL , primary file etc

3. Run the code like

. ./classpath

java SpeedTest

4. Sample output ( for 1.5 GB file )

Size of file in bytes 1602782395
Size of file in KB 1565217.0
Size of file in MB 1528.5322265625
Starting Uploadler
Sending File to UCM ----->

hostname is 10.184.36.144
Sec is myrealm
Time out value is 780000
@Properties LocalData
UserDateFormat=iso8601
IdcService=CHECKIN_UNIVERSAL
UserTimeZone=UTC
dDocTitle=Test RIDC Checkin 1565217.0
dDocType=Document
dDocAccount=
dSecurityGroup=Public
@end
----->5% speed 78260.85 KB/sec ETA 19.0 sec
----->14% speed 109565.19 KB/sec ETA 12.285714285714285 sec
----->23% speed 119999.97 KB/sec ETA 10.043478260869565 sec
----->32% speed 125217.36 KB/sec ETA 8.5 sec
----->42% speed 131478.228 KB/sec ETA 6.904761904761905 sec
----->50% speed 130434.75 KB/sec ETA 6.0 sec
----->60% speed 134161.45714285714 KB/sec ETA 4.666666666666668 sec
----->68% speed 133043.445 KB/sec ETA 3.7647058823529402 sec
----->68% speed 118260.84 KB/sec ETA 4.23529411764706 sec
----->75% speed 117391.275 KB/sec ETA 3.333333333333334 sec
----->76% speed 108142.26545454546 KB/sec ETA 3.473684210526315 sec
----->76% speed 99130.41 KB/sec ETA 3.7894736842105257 sec
----->77% speed 92709.00692307693 KB/sec ETA 3.8831168831168803 sec
----->77% speed 86086.935 KB/sec ETA 4.181818181818183 sec
----->77% speed 80347.806 KB/sec ETA 4.480519480519483 sec
----->77% speed 75326.068125 KB/sec ETA 4.779220779220779 sec
----->77% speed 70895.12294117647 KB/sec ETA 5.077922077922079 sec
----->77% speed 66956.505 KB/sec ETA 5.376623376623375 sec
----->77% speed 63432.478421052634 KB/sec ETA 5.675324675324674 sec
----->77% speed 60260.8545 KB/sec ETA 5.974025974025974 sec
----->77% speed 57391.29 KB/sec ETA 6.272727272727273 sec
----->79% speed 56205.51954545455 KB/sec ETA 5.848101265822784 sec
----->92% speed 62608.68 KB/sec ETA 2.0 sec
-->100%

time took only for file transfer is 23 sec
Network Speed between client & UCM server is 68052.91304347826 KB/sec
Network Speed between client & UCM server is 66.45792289402173MB/sec
ContentID is STJACOBPC1IDCO001819

Time took in UCM server is 45.422 sec
Processing Capacity of your environment 34459.44696402624 KB/s
Processing Capacity of your environment 34.45944696402624 MB/s






Java details :

1. Java main class to define the thread class
2. In the thread demo class , start () should contain the upload process
3. run () used to track the upload process

4. There will be different class which deals  with RIDC action should be refer by step 2